पूरा पृष्ठ ऑब्जेक्ट मॉडल फ्रेमवर्क -2021

इस ट्यूटोरियल में, हम पेज ऑब्जेक्ट मॉडल के बारे में जानेंगे और साथ ही हम पेज ऑब्जेक्ट मॉडल फ्रेमवर्क को स्क्रैच से डिजाइन और विकसित करेंगे। 

हमने सभी पर चर्चा की थी सेलेनियम में फ्रेमवर्क के प्रकार, पेज ऑब्जेक्ट मॉडल सहित , यहाँ हम गहराई के माध्यम से जाना होगा।

हम नीचे की विशेषताओं को डिजाइन और विकसित करेंगे।

सेलेनियम में पेज ऑब्जेक्ट मॉडल फ्रेमवर्क डिज़ाइन क्या है  

पेज ऑब्जेक्ट मॉडल सेलेनियम परीक्षण स्वचालन के निर्माण के लिए एक डिज़ाइन मॉडल है, जहां हम परीक्षण के तहत अपने पूरे एप्लिकेशन को छोटे पृष्ठों में वितरित करते हैं (कभी-कभी एक वेबपेज को एक पेज के रूप में माना जाता है, और कभी-कभी एक वेबपेज के एक उप-भाग को एक पेज के रूप में भी माना जाता है)। इनमें से प्रत्येक पृष्ठ को जावा वर्ग के रूप में दर्शाया गया है, और पृष्ठों की कार्यक्षमता संबंधित पृष्ठ के जावा वर्ग में विभिन्न विधियों के रूप में लिखी गई है।

मान लीजिए कि आपके पास एक जीमेल एप्लिकेशन है जिसे आप स्वचालित करेंगे; इसलिए जीमेल लॉगिन पेज वहाँ है जहाँ आपके पास कुछ प्रमुख फ़ंक्शंस हैं जैसे लॉगिन, एक खाता बनाना, आदि।

यहां हम GmailLoginPage के रूप में एक जावा क्लास बनाएंगे, और हम PerformLogin (), createUserAccount, आदि के नाम से तरीके लिखेंगे। 

मान लें कि एक बार जब आप अपने जीमेल खाते में लॉग इन हो जाते हैं, तो आपके पास इनबॉक्स, भेजे गए आइटम, कचरा आदि जैसी कई विशेषताएं होती हैं। अब यहां प्रत्येक मॉड्यूल के लिए, आप एक जावा वर्ग बनाते हैं और संबंधित जावा कक्षाओं के अंदर जावा के तरीकों के रूप में उनकी कार्यक्षमता बनाए रखते हैं। 

क्यों पेज वस्तु मॉडल

पृष्ठ ऑब्जेक्ट मॉडल एक बहुत ही मजबूत और उन्नत ढांचा डिजाइन मॉडल है जहाँ आप नीचे के क्षेत्रों का ध्यान रख सकते हैं: 

हाइब्रिड पेज ऑब्जेक्ट मॉडल फ्रेमवर्क संरचना

में पिछले ट्यूटोरियल, हमने हाइब्रिड पेज ऑब्जेक्ट मॉडल को समझा, और अब हम एक रूपरेखा तैयार करेंगे और उसका विकास करेंगे।

पृष्ठ ऑब्जेक्ट मॉडल ढांचे की वास्तुकला

हम बस एक मावेन प्रोजेक्ट बना सकते हैं और POM.xml फ़ाइल में निर्भरता को शामिल कर सकते हैं। फ्रेमवर्क के लिए आवश्यक है कि शुरू में जो एक जैसा दिखता है: 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
\txsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
\t<modelVersion>4.0.0</modelVersion>

\t<groupId>demo</groupId>
\t<artifactId>DemoAutomation</artifactId>
\t<version>0.0.1-SNAPSHOT</version>
\t<packaging>jar</packaging>

\t<name>DemoAutomation</name>
\t<url>http://maven.apache.org</url>
\t<properties>
\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
\t</properties>
\t<build>
\t\t<plugins>
\t\t\t<plugin>
\t\t\t\t<groupId>org.apache.maven.plugins</groupId>
\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>
\t\t\t\t<version>3.0</version>
\t\t\t\t<configuration>
\t\t\t\t\t<source>7</source>
\t\t\t\t\t<target>7</target>
\t\t\t\t</configuration>
\t\t\t</plugin>
\t\t\t<plugin>
\t\t\t\t<groupId>org.apache.maven.plugins</groupId>
\t\t\t\t<artifactId>maven-surefire-plugin</artifactId>
\t\t\t\t<version>2.4.2</version>
\t\t\t\t<configuration>
\t\t\t\t\t<suiteXmlFiles>
\t\t\t\t\t\t<suiteXmlFile>testNg.xml</suiteXmlFile>
\t\t\t\t\t</suiteXmlFiles>
\t\t\t\t</configuration>
\t\t\t</plugin>
\t\t</plugins>
\t</build>
\t<reporting>
\t\t<plugins>
\t\t\t<plugin>
\t\t\t\t<groupId>org.reportyng</groupId>
\t\t\t\t<artifactId>reporty-ng</artifactId>
\t\t\t\t<version>1.2</version>
\t\t\t\t<configuration>
\t\t\t\t    <outputdir>/target/testng-xslt-report</outputdir>
\t\t\t\t    <sorttestcaselinks>true</sorttestcaselinks>
\t\t\t            <testdetailsfilter>FAIL,SKIP,PASS,CONF,BY_CLASS</testdetailsfilter>
\t\t\t\t    <showruntimetotals>true</showruntimetotals>
\t\t\t\t</configuration>
\t\t\t</plugin>
\t\t</plugins>
\t</reporting>
\t<dependencies>
\t\t<dependency>
\t\t\t<groupId>org.seleniumhq.selenium</groupId>
\t\t\t<artifactId>selenium-server</artifactId>
\t\t\t<version>2.53.0</version>
\t\t</dependency>
\t\t<dependency>
\t\t\t<groupId>org.testng</groupId>
\t\t\t<artifactId>testng</artifactId>
\t\t\t<version>6.8.1</version>
\t\t</dependency>
\t\t<dependency>
\t\t\t<groupId>org.apache.poi</groupId>
\t\t\t<artifactId>poi</artifactId>
\t\t\t<version>3.8</version>
\t\t</dependency>
\t\t<dependency>
\t\t\t<groupId>org.apache.poi</groupId>
\t\t\t<artifactId>poi-ooxml</artifactId>
\t\t\t<version>3.8</version>
\t\t</dependency>

\t\t<dependency>
\t\t\t<groupId>com.googlecode.json-simple</groupId>
\t\t\t<artifactId>json-simple</artifactId>
\t\t\t<version>1.1</version>
\t\t</dependency>

\t\t<dependency>
\t\t\t<groupId>net.sourceforge.jexcelapi</groupId>
\t\t\t<artifactId>jxl</artifactId>
\t\t\t<version>2.6</version>
\t\t</dependency>
\t</dependencies>
</project>

उसके बाद, हम छोटे मॉड्यूल और उपयोगिताओं का निर्माण करेंगे, जहां हमने इस स्नैपशॉट को केवल उच्च-स्तरीय अंतर्दृष्टि / दृश्य प्रदान करने के लिए नीचे संलग्न किया है। हम एक-एक करके उपयोगिताओं का निर्माण करेंगे। 

यहाँ नीचे मॉड्यूल हैं जो हम विकसित करेंगे; हमने उसी के लिए कोड स्निपेट प्रदान किया है: 

DriverUtils - पेज ऑब्जेक्ट मॉडल फ्रेमवर्क

यह मॉड्यूल विभिन्न ब्राउज़रों (क्रोम, फ़ायरफ़ॉक्स, आदि) के साथ काम करने के लिए सभी उपयोगिताओं और समर्थन प्रदान करता है। यह उपयोगिता फ़ैक्टरी पर आधारित है डिज़ाइन पैटर्न, जैसा कि हमने यहां पिछले ट्यूटोरियल में चर्चा की थी।

पैकेज com.base.driverUtils; आयात org.openqa.selenium.WebDriver; सार्वजनिक इंटरफ़ेस IDriver {सार्वजनिक वेबड्राइवर init (स्ट्रिंग ब्राउज़रनाम); }

लोकलड्राइवर कार्यान्वयन, जो स्थानीय रूप से निष्पादित होगा सेलेनियम वेबड्राइवर :

पैकेज com.base.driverUtils; आयात org.openqa.selenium.WebDriver; आयात org.openqa.selenium.chrome.ChromeDriver; आयात org.openqa.selenium.firefox.FirefoxDriver; आयात org.openqa.selenium.ie.InternetExplorerDriver; पब्लिक क्लास लोकलड्राइवर IDriver लागू करता है { सार्वजनिक वेबड्राइवर init (स्ट्रिंग ब्राउज़र नाम) { स्विच (ब्राउज़र नाम) { केस "फ़ायरफ़ॉक्स": नया फ़ायरफ़ॉक्स ड्राइवर लौटाएं(); केस "क्रोम": System.setProperty("webdriver.chrome.driver", "..\\\\DummyAutomation\\\\DriverExe\\\\chromedriver.exe"); नया ChromeDriver लौटाएँ(); केस "यानी": System.setProperty("webdriver.ie.driver", "..\\\\DummyAutomation\\\\DriverExe\\\\IEDriverServer.exe"); नया InternetExplorerDriver लौटाएँ(); डिफ़ॉल्ट: नया फ़ायरफ़ॉक्सड्राइवर लौटाएँ(); } } }

रिमोट वेबड्राइवर: रिमोट वेबड्राइवर (जैसे सेलेनियम ग्रिड) के साथ काम करने के लिए, आपको ब्राउज़र ड्राइवर के दूरस्थ संदर्भ की आवश्यकता होती है, जो इस प्रकार है: 

पैकेज com.base.driverUtils; आयात java.net.MalformedURLException; java.net.URL आयात करें; आयात org.openqa.selenium.WebDriver; आयात org.openqa.selenium.remote.DesiredCapabilities; आयात org.openqa.selenium.remote.RemoteWebDriver; पब्लिक क्लास रिमोटड्राइवर IDriver लागू करता है {वांछित क्षमता कैप्स; स्ट्रिंग रिमोटहुबर्ल; @Override सार्वजनिक वेबड्राइवर init (स्ट्रिंग ब्राउज़रनाम) {स्विच (ब्राउज़रनाम) {केस "फ़ायरफ़ॉक्स": कोशिश करें {नया रिमोटवेबड्राइवर (नया यूआरएल (रिमोट हबरल), कैप्स.फ़ायरफ़ॉक्स ()); } कैच (MalformedURLException e2) {// TODO ऑटो-जेनरेटेड कैच ब्लॉक e2.printStackTrace (); } केस "क्रोम": कोशिश करें { नया रिमोटवेबड्राइवर लौटाएं (नया यूआरएल (रिमोटहुबर्ल), कैप्स क्रोम ()); } कैच (MalformedURLException e1) {// TODO ऑटो-जेनरेटेड कैच ब्लॉक e1.printStackTrace (); } मामला "यानी": कोशिश करें {नया रिमोटवेबड्राइवर (नया यूआरएल (रिमोट हबरल), कैप्स.इंटरनेट एक्सप्लोरर ()); } कैच (MalformedURLException e) {// TODO ऑटो-जेनरेटेड कैच ब्लॉक e.printStackTrace (); } डिफ़ॉल्ट: कोशिश करें {नया रिमोटवेबड्राइवर लौटाएं (नया यूआरएल (रिमोटहुबर्ल), कैप्स.फ़ायरफ़ॉक्स ()); } कैच (MalformedURLException e) {// TODO ऑटो-जेनरेटेड कैच ब्लॉक e.printStackTrace (); } } वापसी शून्य; } }

फैक्टरी चालक वर्ग: यह हमें आपकी पसंद के ब्राउज़र को आरंभ करने के लिए ड्राइवर वर्ग (दूरस्थ / स्थानीय) ऑब्जेक्ट प्रदान करता है। हम कॉन्फ़िगरेशन फ़ाइल के माध्यम से ड्राइवर (स्थानीय या रिमोट) और ब्राउज़र (क्रोम या फ़ायरफ़ॉक्स आदि) का प्रकार लेंगे (हमने कॉन्फ़िगरेशन को रखने के लिए एक गुण फ़ाइल का उपयोग किया है, जिसे हम शीघ्र ही साझा करेंगे)

पैकेज com.base.driverUtils; पब्लिक क्लास ड्राइवरप्रोवाइडर {पब्लिक IDriver getDriver (स्ट्रिंग टाइपऑफ़ड्राइवर एक्ज़ीक्यूशन) {स्विच (टाइपऑफ़ड्राइवर एक्ज़ीक्यूशन) {केस "लोकल": नया लोकलड्राइवर (); मामला "रिमोट": नया रिमोटड्राइवर लौटाएं (); डिफ़ॉल्ट: नया लोकलड्राइवर लौटाएं (); } } }

अब आपको जहां कहीं भी ड्राइवर संदर्भ की आवश्यकता है, आप बस फैक्ट्री क्लास ऑब्जेक्ट (इस मामले में DriverProvider) का ऑब्जेक्ट बना सकते हैं और ड्राइवर ब्राउज़र इंस्टेंस को आरंभ कर सकते हैं।

यहाँ बहुत ही बुनियादी विन्यास फाइल है; आप एक गुण फ़ाइल बना सकते हैं और इस तरह के मूल्यों को संग्रहीत कर सकते हैं: 

modeOfExecution=स्थानीय ब्राउज़र=क्रोम url=http://www.applicationUrl.com/

DataUtils- पेज ऑब्जेक्ट मॉडल फ्रेमवर्क: 

हमने यहां डेटा उपयोगिताओं को उसी फ़ैक्टरी डिज़ाइन पैटर्न के रूप में डिज़ाइन किया है, जैसा कि हमने ड्राइवर ब्राउज़र मॉड्यूल को लागू करने से किया था।

यहाँ उसी के लिए नीचे दिए गए कोड स्निपेट है; ढांचे में, हमने एक्सेल के बर्तन और गुणों के बर्तनों को दिखाया है, आप अन्य डेटा उपयोगिताओं जैसे कि YAML, PDF, आदि का समर्थन करने के लिए और अधिक बढ़ा सकते हैं। 

RSI इंटरफेस यहाँ इस प्रकार है: 

पैकेज com.base.dataUtils; सार्वजनिक इंटरफ़ेस IDataProvider {सार्वजनिक वस्तु [] [] fetchDataSet (स्ट्रिंग... dataFileInfo); सार्वजनिक स्ट्रिंग fetchData (स्ट्रिंग... dataFileInfo); }

यहाँ के लिए कार्यान्वयन है एक्सेल डेटा प्रदाता

पैकेज com.base.dataUtils; java.io.फाइल आयात करें; आयात java.io.FileInputStream; आयात java.io.FileNotFoundException; java.io.IOException आयात करें; आयात org.apache.poi.xssf.usermodel.XSSFCell; आयात org.apache.poi.xssf.usermodel.XSSFSheet; आयात org.apache.poi.xssf.usermodel.XSSFवर्कबुक; सार्वजनिक वर्ग ExcelDataProvider IDataProvider लागू करता है { FileInputStream fis = null; निजी स्थिर XSSFWorkbook कार्यपुस्तिका = शून्य; निजी स्थिर एक्सएसएसएफसी सेल सेल; निजी स्थिर XSSFSheet शीट; सार्वजनिक स्थैतिक स्ट्रिंग [] [] एक्सेलडेटासेट = शून्य; @ ओवरराइड पब्लिक ऑब्जेक्ट [] [] भ्रूणडेटासेट (स्ट्रिंग ... डेटाफाइलइन्फो) {स्ट्रिंग एक्सेलफाइलपाथ = डेटाफाइलइन्फो [0]; स्ट्रिंग एक्सेलशीटनाम = डेटाफाइलइन्फो [1]; फ़ाइल फ़ाइल = नई फ़ाइल (एक्सेलफाइलपाथ); कोशिश करें {fis = नया FileInputStream (फ़ाइल); } कैच (FileNotFoundException e) {// TODO ऑटो-जेनरेटेड कैच ब्लॉक e.printStackTrace (); } कोशिश {कार्यपुस्तिका = नई XSSFWorkbook (एफआईएस); } कैच (IOException e) {// TODO ऑटो-जेनरेटेड कैच ब्लॉक e.printStackTrace (); } शीट = वर्कबुक.गेटशीट (एक्सेलशीटनाम); इंट सीआई, सीजे; इंट रोकाउंट = शीट.getLastRowNum (); int TotalCols = sheet.getRow(0).getPhysicalNumberOfCells (); एक्सेलडेटासेट = नया स्ट्रिंग [पंक्ति गणना] [कुल कॉल्स - 1]; सीआई = 0; के लिए (int i = 1; i <= rowCount; i++, ci++) { cj = 0; के लिए (int j = 1; j <= TotalCols - 1; j++, cj++) {कोशिश करें {excelDataSet[ci][cj] = getCellData(i, j); } कैच (अपवाद ई) {// TODO ऑटो-जेनरेटेड कैच ब्लॉक e.printStackTrace (); } } } एक्सेलडेटासेट लौटाएं; } सार्वजनिक स्थैतिक स्ट्रिंग getCellData (int RowNum, int ColNum) अपवाद फेंकता है {कोशिश करें {सेल = शीट। getRow (RowNum)। getCell (ColNum); इंट डेटा टाइप = सेल.गेटसेल टाइप (); अगर (डेटा टाइप == 3) {वापसी ""; } और अगर (डेटा टाइप == XSSFCell.CELL_TYPE_NUMERIC) { int i = (int) Cell.getNumericCellValue (); वापसी Integer.toString(i); } और {स्ट्रिंग CellData = Cell.getStringCellValue (); सेलडेटा लौटाएं; }} कैच (अपवाद ई) {फेंक (ई); } } @ ओवरराइड पब्लिक स्ट्रिंग फ़ेचडाटा (स्ट्रिंग... डेटाफाइलइन्फो) {// TODO ऑटो-जेनरेटेड मेथड स्टब रिटर्न नल; } }

गुण डेटा प्रदाता: 

पैकेज com.base.dataUtils; आयात java.io.FileInputStream; java.io.IOException आयात करें; आयात java.util.Properties; पब्लिक क्लास PropertiesDataProvider IDataProvider को लागू करता है { FileInputStream fis=null; @ ओवरराइड पब्लिक ऑब्जेक्ट [] [] fetchDataSet (स्ट्रिंग ... डेटाफाइलइन्फो) {// TODO ऑटो-जेनरेटेड मेथड स्टब रिटर्न नल; } @ ओवरराइड पब्लिक स्ट्रिंग फ़ेचडाटा (स्ट्रिंग... डेटाफाइलइन्फो) {स्ट्रिंग डेटावैल्यू; स्ट्रिंग पथ टोफाइल = डेटाफाइलइन्फो [0]; स्ट्रिंग कुंजी = डेटाफाइलइन्फो [1]; गुण गुण = नई गुण (); कोशिश करें {fis=new FileInputStream(pathToFile); गुण। लोड (एफआईएस); } कैच (IOException e) {// TODO ऑटो-जेनरेटेड कैच ब्लॉक e.printStackTrace (); } डेटावैल्यू = गुण। गेटप्रॉपर्टी (कुंजी); डेटा वैल्यू लौटाएं; } }

RSI इस डेटा के लिए कारखाना वर्ग उपयोगिताएँ

पैकेज com.base.dataUtils; पब्लिक क्लास डेटा हेल्परप्रोवाइडर {सार्वजनिक IDataProvider getDataHelperProvider (स्ट्रिंग टाइपऑफडाटा हैंडलर) {स्विच (टाइपऑफडाटा हैंडलर) {केस "एक्सेल": नया एक्सेलडाटाप्रोवाइडर (); मामला "गुण": नया गुण लौटाएंडेटाप्रोवाइडर (); } वापसी शून्य; } }

WebAction उपयोगिताओं -पेज ऑब्जेक्ट मॉडल फ्रेमवर्क

उपयोगिताओं में, हम आपके वेब क्रियाओं से संबंधित सभी उपयोगिताओं को लिखते हैं, जैसे (क्लिक, प्रेषक, स्क्रीनशॉट इत्यादि), और हम इसका उपयोग पेज मेथड को प्राप्त करने के लिए पेज मेथड्स में इस ट्यूटोरियल में पहले बताई गई वेब क्रियाओं को करने के लिए कर सकते हैं। 

यहाँ WebAction यूटिलिटीज के लिए कोड स्निपेट दिया गया है: 

पैकेज com.base.webActionHelperUtils; आयात java.util.ArrayList; आयात java.util.List; आयात java.util.concurrent.TimeUnit; आयात org.openqa.selenium.By; आयात org.openqa.selenium.WebDriver; आयात org.openqa.selenium.WebElement; आयात org.openqa.selenium.support.ui.ExpectedConditions; आयात org.openqa.selenium.support.ui.WebDriverWait; पब्लिक क्लास WebActionsHelperUtils {संरक्षित वेबड्राइवर ड्राइवर; सार्वजनिक WebActionsHelperUtils(WebDriver Driver) {this.driver = Driver; } सार्वजनिक शून्य सुरक्षितक्लिक (तत्व द्वारा) { WaitForElementToBeClickAble (तत्व, 30); Driver.findElement (तत्व)। क्लिक करें (); } सार्वजनिक सूची getElements (तत्वों द्वारा) {वापसी Driver.findElements (तत्व); } सार्वजनिक शून्य प्रतीक्षाफॉरवेबएलिमेंट्स टूबीडिस्प्लेड (तत्वों द्वारा, इंट टाइमआउट्स) {वेबड्राइवरवेट प्रतीक्षा = नया वेबड्राइवरवेट (ड्राइवर, टाइमऑउट); Wait.until(ExpectedConditions.visibilityOfAllElements(getElements(elements))); } सार्वजनिक शून्य WaitForElementToBeClickAble (तत्व द्वारा, int timeOutSeconds) { WebDriverWait WaitForElement = new WebDriverWait (ड्राइवर, टाइमऑउटसेकंड); WaitForElement.until(ExpectedConditions.elementToBeClickable(element)); } सार्वजनिक शून्य WaitForElementToBeDisplayed (तत्व द्वारा, int timeOuts) { WebDriverWait प्रतीक्षा = नया WebDriverWait (ड्राइवर, टाइमऑउट); प्रतीक्षा करें। तक (अपेक्षित शर्तें। दृश्यताऑफइलेमेंट लोकेटेड (तत्व)); } सार्वजनिक शून्य enterTextIntoElement (तत्व द्वारा, स्ट्रिंग textToBeEntered) {driver.findElement(element).sendKeys(textToBeEntered); } सार्वजनिक स्ट्रिंग getText (तत्व द्वारा) {वापसी ड्राइवर.findElement (तत्व)। getText (); } सार्वजनिक स्ट्रिंग getAttribute (तत्व द्वारा, स्ट्रिंग विशेषता) {वापसी Driver.findElement (तत्व)। getAttribute (विशेषता); } सार्वजनिक बूलियन चयनित है (तत्व द्वारा) { बूलियन isElementSelected = false; अगर (driver.findElement(element).isSelected() == true) {isElementSelected = true; } वापसी isElementSelected; } सार्वजनिक शून्य स्पष्ट फ़ील्ड (तत्व द्वारा) {driver.findElement (तत्व)। स्पष्ट (); } सार्वजनिक शून्य परोक्ष रूप से प्रतीक्षा करें (इंट टाइमऑउट्स) {driver.manage().timeouts().implicitlyWait(timeOuts, TimeUnit.SECONDS); } सार्वजनिक बूलियन isElementPresent (तत्व द्वारा) {कोशिश करें {driver.findElement (तत्व); सच लौटना; } पकड़ (अपवाद ई) {झूठी वापसी; } } सार्वजनिक शून्य स्विचटॉब (इंट इंडेक्सऑफ़टैब) { ArrayList टैब = नया ऐरेलिस्ट (driver.getWindowHandles()); Driver.switchTo().window(tabs.get(indexOfTab)); } }

पेज मॉड्यूल उपयोगिताओं-पेज ऑब्जेक्ट मॉडल फ्रेमवर्क

जैसा कि हम जानते हैं, हमें पेज क्लास बनाना है और पेज फंक्शन्स को पेज मेथड में रखना है, तो अब पेज ऑब्जेक्ट मॉडल फ्रेमवर्क के लिए पेज मॉड्यूल बनाएं: 

हर पेज क्लास फिर से WebAction Utils तक फैली हुई है कि हम अभी और विकसित हुए पेज इंटरफेस को लागू करता है, जहां पेज इंटरफेस संबंधित पेज के वेब एलिमेंट्स / लोकेटर को रखने के लिए इंटरफेस के अलावा कुछ नहीं है।

अब हमें लोकेटरों को संग्रहीत करने के लिए इंटरफेस की आवश्यकता क्यों है: 

इसलिए हमने इस दृष्टिकोण के अनुसार स्टोर करने के लिए अलग-अलग पेज लोकेटर के लिए अलग-अलग इंटरफेस का उपयोग किया; हम उपरोक्त सभी समस्या कथनों को हल करते हैं, जो समय जटिलता, अंतरिक्ष जटिलता और इंटरफेस में स्वच्छ और बनाए रखने योग्य कोडबेस हैं, हमें लोकेटर तक पहुंचने के लिए ऑब्जेक्ट बनाने की आवश्यकता नहीं है।

पैकेज com.base.pageModules; आयात java.util.List; आयात org.openqa.selenium.By; आयात org.openqa.selenium.WebDriver; आयात org.openqa.selenium.WebElement; आयात com.base.commonUtils.JsonHandler; आयात com.base.webActionHelperUtils.WebActionsHelperUtils; आयात com.page.locatorModules.HomePageLocators; पब्लिक क्लास होमपेज WebActionsHelperUtils लागू करता है HomePageLocators {JSonHandler jsonHandler = new JSonHandler(); सार्वजनिक होमपेज (वेबड्राइवर ड्राइवर) {सुपर (ड्राइवर); यह चालक = चालक; } सार्वजनिक शून्य दर्ज करेंSearchdataToSearchField(String searchData) { WaitForElementToBeClickAble(SEARCH_BOX, 10); EnterTextIntoElement (SEARCH_BOX, सर्चडेटा); } सार्वजनिक शून्य navigatToUrl() {driver.get(url); } सार्वजनिक शून्य पर कब्जा खोज सुझाव (स्ट्रिंग पथ ToJsonDataStore, स्ट्रिंग खोज डेटा) { सूची तत्व = getElements (SUGGESTION_BOX); jsonHandler.captureAndWriteJsonData (तत्व, pathToJsonDataStore, searchData); } सार्वजनिक शून्य जेनेरिकवेट (इंट टाइमऑउट्स) {अंतर्निहित रूप से प्रतीक्षा करें (टाइमऑट); } सार्वजनिक शून्य clikcOnSelectedElement (स्ट्रिंग विकल्प) { int विकल्प चयन = Integer.parseInt (विकल्प); SafeClick(By.xpath("//div[@id='s-separator']/following-sibling::div[" + optionSelection + "]")); } }

इसी तरह, आप पृष्ठ में पृष्ठ सुविधाओं सहित संबंधित पेज वर्गों के अंदर पृष्ठ के विभिन्न तरीकों पर रख सकते हैं। 

यहाँ है कैसे पेज लोकेटर इंटरफेस हमशक्ल : 

पैकेज com.page.locatorModules; आयात org.openqa.selenium.By; सार्वजनिक इंटरफ़ेस होमपेज लोकेटर {SEARCH_BOX=By.id("twotabsearchtextbox"); SUGGESTION_BOX=By.xpath("//div[@id='suggestions']/div"); द्वारा }

अब अगला सेगमेंट, आप एक बेससेटअप या बेसटेस्ट बना सकते हैं, जहाँ आप इनिशियलाइज़ेशन / डेटा लोडिंग पार्ट्स को परफॉर्म करना चाहते हैं। इसके अलावा, आप उपयोग कर सकते हैं @beforeTest, @beofreClass इस कक्षा में ही विधियाँ और उन्हें अपने परीक्षण वर्गों में उपयोग करें।

बेससेटअप वर्ग ऐसा दिखता है: 

पैकेज com.demo.testS; आयात org.openqa.selenium.WebDriver; आयात org.testng.annotations.DataProvider; आयात com.base.dataUtils.DataHelperProvider; आयात com.base.dataUtils.IDataProvider; आयात com.base.driverUtils.DriverProvider; पब्लिक क्लास बेससेटअप { \tपब्लिक वेबड्राइवर ड्राइवर; \tड्राइवरप्रदाता ब्राउज़रप्रदाता = नया ड्राइवरप्रदाता(); \tDataHelperProvider datahelperProvider = new DataHelperProvider(); \tIDataProvider dataProvider = datahelperProvider.getDataHelperProvider("गुण"); \tIDataProvider dataProviderExcel = datahelperProvider.getDataHelperProvider("excel"); \tसार्वजनिक अंतिम स्ट्रिंग configProperties = "..\\\\DummyAutomation\\\\TestConfigsData\\\\config.properties"; \tसार्वजनिक स्ट्रिंग url = dataProvider.fetchData(configProperties, "url"); \tString modeOfExecution = dataProvider.fetchData(configProperties, "modeOfExecution"); \tस्ट्रिंग ब्राउज़रनाम = dataProvider.fetchData(configProperties, "ब्राउज़र"); \tString pathToJasonDataStore = "..\\\\DummyAutomation\\\\ProductJsonData\\\\"; \tString pathToExcelData = "..\\\\DummyAutomation\\\\TestConfigsData\\\\TestData.xlsx"; \tसार्वजनिक वेबड्राइवर getDriver() { \t\return ड्राइवर; \t} \tprotected void setDriver() { \t\tdriver = ब्राउज़रProvider.getDriver(modeOfExecution).init(browserName); \t} \t@DataProvider(नाम = "SearchFunctionality") \tpublic ऑब्जेक्ट[][] getCityDetails() { \t\tObject[][] arrayObject = dataProviderExcel.fetchDataSet(pathToExcelData, "DataFeed"); \t\return arrayObject; \टी} }

टेस्ट कक्षाएं: जैसा कि हम यहां TestNG का उपयोग कर रहे हैं, इसलिए आपको परीक्षण स्क्रिप्ट को विकसित करने के लिए @test विधि लिखने की आवश्यकता है, जैसे: 

यहाँ टेस्ट कक्षाओं के लिए कोड स्निपेट है  

पैकेज com.demo.testS; आयात org.testng.annotations.AfterMethod; आयात org.testng.annotations.BeforeMethod; आयात org.testng.annotations.Test; आयात com.base.pageModules.HomePage; आयात com.base.pageModules.SearchPage; पब्लिक क्लास डेमोटेस्ट बेससेटअप का विस्तार करता है {होमपेज होमपेज; खोज पृष्ठ खोज पृष्ठ; @BeforeMethod सार्वजनिक शून्य setUpTest () {setDriver (); होमपेज = नया होमपेज (ड्राइवर); सर्चपेज = नया सर्चपेज (ड्राइवर); होमपेज.navigatToUrl (); } @Test(dataProvider = "SearchFunctionality") सार्वजनिक शून्य खोज (स्ट्रिंग searchData, String SelectOption) { homePage.enterSearchdataToSearchField(searchData); होमपेज.जेनेरिकप्रतीक्षा(5); HomePage.captureSearchSuggestion(pathToJasonDataStore, searchData); HomePage.clikcOnSelectedElement(selectOption); searchPage.clickOnFirstProduct (); searchPage.switchToProductSpecificPage (); searchPage.captureProductData (pathToJasonDataStore, searchData); } @AfterMethod सार्वजनिक शून्य टियरडाउन () { अगर (चालक! = शून्य) {driver.quit (); } } }

TestNgXML फ़ाइल -पेज ऑब्जेक्ट मॉडल फ्रेमवर्क

आपको testng.xml के लिए एक XML वर्ग को परिभाषित करने की आवश्यकता होगी, जो मूल रूप से एक इकाई परीक्षण रूपरेखा है और आपके स्वचालन के प्रवाह को नियंत्रित करता है; आप स्वयं वहां परीक्षण कक्षाओं का उल्लेख कर सकते हैं।







तो इन गतिविधियों के साथ, आपका मूल पेज ऑब्जेक्ट मॉडल अभी रूपरेखा तैयार होनी चाहिए। यदि आप अपने ढांचे के उन्नत संस्करण को प्राप्त करना चाहते हैं, तो आप इन क्षेत्रों को शामिल कर सकते हैं: 

रिपोर्टिंग फ़ीचर-पेज ऑब्जेक्ट मॉडल फ्रेमवर्क

आप उपलब्ध किसी भी रिपोर्टिंग सुविधा का उपयोग कर सकते हैं लुभाना, विस्तारक, TestNG रिपोर्ट, या अग्रिम रिपोर्टिंग का उपयोग करके ELK स्टैक, इत्यादि 

बस सादगी रखने के लिए, हम यहां रिपोर्टिंग रिपोर्ट को एक्सटेंन्ट रिपोर्ट के साथ दिखा रहे हैं, जिसमें इसके साथ कई विशेषताएं हैं और इसे रिपोर्टिंग के एक मध्यवर्ती स्तर के रूप में माना जा सकता है। 

एक्स्टेंट रिपोर्ट के साथ काम करने के लिए आपको उपयोगिताओं के लिए एक वर्ग बनाना होगा, और ऐसा करते समय, आपको इसे लागू करना होगा TestNg से इंटरफ़ेस ITestlistener; नीचे दिए गए कोड से पता चलता है कि कैसे: 

package com.cyborg.core.generic.reportUtils;
import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.Status;
import com.aventstack.extentreports.reporter.ExtentHtmlReporter;
import com.cyborg.core.generic.dataUtils.PropertiesDataUtils;
import io.appium.java_client.android.AndroidDriver;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.Augmenter;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;
import org.testng.Reporter;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
public class ExtentReportUtils implements ITestListener {
  String screenShotPath = "";
  static ExtentReports extentReports;
  ExtentHtmlReporter extentHtmlReporter;
  protected ExtentTest extentTest;
  static String pathOfFile = "./configurator.properties";
  PropertiesDataUtils propertiesDataUtils = PropertiesDataUtils.getInstance(pathOfFile);
   Boolean log_to_kibana=Boolean.parseBoolean(PropertiesDataUtils.configDataStore.get("log_to_kibana"));
 
   public void setup() {
     try {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
        Date now = new Date();
        String currentTime = simpleDateFormat.format(now);
        extentHtmlReporter = new ExtentHtmlReporter(
              new File(System.getProperty("user.dir") + "_Reports_" + currentTime + ".html"));
        extentHtmlReporter.loadXMLConfig(
              new File(System.getProperty("user.dir") + "/src/test/resources/config/extent-config.xml"));
        extentReports = new ExtentReports();
        extentReports.setSystemInfo("Environment", PropertiesDataUtils.configDataStore.get("Environment"));
        extentReports.setSystemInfo("AppName", PropertiesDataUtils.configDataStore.get("AppName"));
        extentReports.setSystemInfo("ModeOfExecution", PropertiesDataUtils.configDataStore.get("modeOfExecution"));
        extentReports.attachReporter(extentHtmlReporter);
        System.out.println("DONE SETUP FOR extent Report");
     } catch (Exception ex) {
        ex.printStackTrace();
     }
  }
  public void setup(String reportName) {
     extentReports = getExtent(reportName);
  }
  public ExtentReports getExtent(String reportName) {
     if (extentReports != null)
        return extentReports; // avoid creating new instance of html file
     extentReports = new ExtentReports();
     extentReports.attachReporter(getHtmlReporter(reportName));
     return extentReports;
  }
  private ExtentHtmlReporter getHtmlReporter(String reportName) {
     extentHtmlReporter = new ExtentHtmlReporter("./reports/" + reportName + ".html");
     extentHtmlReporter.loadXMLConfig("./src/test/resources/config/extent-config.xml");
     // make the charts visible on report open
     extentHtmlReporter.config().setChartVisibilityOnOpen(true);
     extentHtmlReporter.config().setDocumentTitle(PropertiesDataUtils.configDataStore.get("AppName"));
     extentHtmlReporter.config().setReportName("Regression Cycle");
     // Append the existing report
     extentHtmlReporter.setAppendExisting(false);
     Locale.setDefault(Locale.ENGLISH);
     return extentHtmlReporter;
  }
  public void registerTestMethod(Method method) {
     String testName = method.getName();
     extentTest = extentReports.createTest(testName);
  }
  public void sequenceScreenShot(AndroidDriver driver, String application, String step) {
     try {
        extentTest.addScreenCaptureFromPath(screenshotStepWise(driver, application, step));
     } catch (Exception e) {
        e.printStackTrace();
     }
  }
  public void screenshotAnyCase(ITestResult result, WebDriver driver, String application) {
     String testName = result.getName();
     File file = new File(".");
     String filename = testName + ".png";
     String filepath = null;
     try {
        filepath = file.getCanonicalPath() + "/ScreenShots/" + application + "/" + putLogDate() + filename;
     } catch (IOException e1) {
        e1.printStackTrace();
     }
     if (PropertiesDataUtils.configDataStore.get("run_on_jenkins").equalsIgnoreCase("true"))
        screenShotPath = "job/Cyborg2/" + PropertiesDataUtils.configDataStore.get("build_number")
              + "/artifact/ScreenShots/" + application + "/" + putLogDate() + filename;
     else
        screenShotPath = System.getProperty("user.dir") + "/ScreenShots/" + application + "/" + putLogDate()
              + filename;
     try {
        WebDriver augmentedDriver = new Augmenter().augment(driver);
        File screenshotFile = ((TakesScreenshot) augmentedDriver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(screenshotFile, new File(filepath));
        File reportFile = new File(filepath);
        reportLogScreenshot(reportFile, filename, application);
     } catch (Exception e) {
        Reporter.log("Unable to get the screenshot");
     }
  }
  public String screenshotStepWise(WebDriver driver, String application, String step) throws Exception {
     File file = new File(".");
     String filename = step + ".png";
     String filepath = null;
     try {
        filepath = file.getCanonicalPath() + "/ScreenShots/" + application + "/" + putLogDateWithoutmm() + filename;
     } catch (IOException e1) {
        e1.printStackTrace();
     }
     if (PropertiesDataUtils.configDataStore.get("run_on_jenkins").equalsIgnoreCase("true"))
        screenShotPath = "job/Cyborg2/" + PropertiesDataUtils.configDataStore.get("build_number")
              + "/artifact/ScreenShots/" + application + "/" + putLogDateWithoutmm() + filename;
     else
        screenShotPath = System.getProperty("user.dir") + "/ScreenShots/" + application + "/"
              + putLogDateWithoutmm() + filename;
     try {
        WebDriver augmentedDriver = new Augmenter().augment(driver);
        File screenshotFile = ((TakesScreenshot) augmentedDriver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(screenshotFile, new File(filepath));
     } catch (Exception e) {
        Reporter.log("Unable to get the screenshot");
     }
     return screenShotPath;
  }
  protected void reportLogScreenshot(File file, String fileName, String application) {
     System.setProperty("org.uncommons.reportng.escape-output", "false");
     String absolute = file.getAbsolutePath();
     if (PropertiesDataUtils.configDataStore.get("run_on_jenkins").equalsIgnoreCase("true"))
        absolute = " /job/Cyborg2/" + PropertiesDataUtils.configDataStore.get("build_number")
              + "/artifact/ScreenShots/" + application + "/" + putLogDate() + fileName;
     else
        absolute = System.getProperty("user.dir") + "/ScreenShots/" + application + "/" + putLogDate() + fileName;
     screenShotPath = absolute;
  }
  public void captureStatus(ITestResult result) {
     if (result.getStatus() == ITestResult.SUCCESS) {
        extentTest.log(Status.PASS, "The test method Named as :" + result.getName() + " is PASSED");
        try {
           extentTest.addScreenCaptureFromPath(screenShotPath);
        } catch (IOException e) {
           e.printStackTrace();
        }
     } else if (result.getStatus() == ITestResult.FAILURE) {
        extentTest.log(Status.FAIL, "The test method Named as :" + result.getName() + " is FAILED");
        extentTest.log(Status.FAIL, "The failure : " + result.getThrowable());
        extentTest.log(Status.FAIL, "StackTrace: " + result.getThrowable());
        try {
           extentTest.addScreenCaptureFromPath(screenShotPath);
        } catch (IOException e) {
           e.printStackTrace();
        }
     } else if (result.getStatus() == ITestResult.SKIP) {
        extentTest.log(Status.SKIP, "The test method Named as :" + result.getName() + " is SKIPPED");
     }
  }
  public String putLogDate() {
     Calendar c = new GregorianCalendar();
     c.add(Calendar.DATE, +0);
     Date s = c.getTime();
     String dateString = new SimpleDateFormat("_EEE_ddMMMyyyy_hhmm").format(s);
     return dateString;
  }
  public String putLogDateWithoutmm() {
     Calendar c = new GregorianCalendar();
     c.add(Calendar.DATE, +0);
     Date s = c.getTime();
     String dateString = new SimpleDateFormat("_EEE_ddMMMyyyy_hh").format(s);
     return dateString;
  }
  public void cleanup() {
     extentReports.flush();
  }
  public void onTestStart(ITestResult result) {
     /*
      * try { DateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH-mm-ss"); Date
      * date = new Date();
      */
     /*
      * record = new ATUTestRecorder(System.getProperty("user.dir")+"/videos",
      * dateFormat.format(date), false); record.start();
      *//*
         *
         * } catch (ATUTestRecorderException e) { e.printStackTrace(); }
         */
  }
  public void onTestSuccess(ITestResult result) {
     /*
      * try { record.stop(); } catch (Exception e) { e.printStackTrace(); }
      */
     String testDescription = result.getMethod().getDescription();
     String testCaseNumber = testDescription.split("_")[0];
     String testDesc = testDescription.split("_")[1];
     String status = "PASSED";
     String exceptionType = "NA";
     String detailedError = "NA";
    
     String data ="{\
" +
           "   \\"testCaseNumber\\" : \\""+testCaseNumber+"\\",\
" +
           "   \\"status\\" : \\""+status+"\\",\
" +
           "   \\"testDescription\\" : \\""+testDesc+"\\",\
" +
           "   \\"exceptionType\\" : \\""+exceptionType+"\\",\
" +
           "   \\"detailedError\\":\\""+detailedError+"\\"\
" +
           "   \
" +
           "}";
     
  }
  @Override
  public void onTestFailure(ITestResult result) {
    
     String testDescription = result.getMethod().getDescription();
     String testCaseNumber = testDescription.split("_")[0];
     String testDesc = testCaseNumber.split("_")[1];
     String status = "FAILED";
     String exceptionType = String.valueOf(result.getThrowable().getClass().getSimpleName());
     String detailedError = String.valueOf(result.getThrowable().getMessage());
    
     String data ="{\
" +
           "   \\"testCaseNumber\\" : \\""+testCaseNumber+"\\",\
" +
           "   \\"status\\" : \\""+status+"\\",\
" +
           "   \\"testDescription\\" : \\""+testDesc+"\\",\
" +
           "   \\"exceptionType\\" : \\""+exceptionType+"\\",\
" +
           "   \\"detailedError\\":\\""+detailedError+"\\"\
" +
           "   \
" +
           "}";
    
     // TODO Auto-generated method stub
  }
  @Override
  public void onTestSkipped(ITestResult result) {
     String testDescription = result.getMethod().getDescription();
     String testCaseNumber = testDescription.split("_")[0];
     String testDesc = testCaseNumber.split("_")[1];
     String status = "SKIPPED";
     String exceptionType = result.getThrowable().getClass().getSimpleName();
     String detailedError = result.getThrowable().getMessage();
    
     String data ="{\
" +
           "   \\"testCaseNumber\\" : \\""+testCaseNumber+"\\",\
" +
           "   \\"status\\" : \\""+status+"\\",\
" +
           "   \\"testDescription\\" : \\""+testDesc+"\\",\
" +
           "   \\"exceptionType\\" : \\""+exceptionType+"\\",\
" +
           "   \\"detailedError\\":\\""+detailedError+"\\"\
" +
           "   \
" +
           "}";
  }
  @Override
  public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
     // TODO Auto-generated method stub
  }
  @Override
  public void onStart(ITestContext context) {
     // TODO Auto-generated method stub
  }
  @Override
  public void onFinish(ITestContext context) {
     // TODO Auto-generated method stub
  }
}

निष्कर्ष: इसके साथ हम सेलेनियम पेज ऑब्जेक्ट मॉडल फ्रेमवर्क विकास का समापन कर रहे हैं जिसके माध्यम से आप पेज ऑब्जेक्ट मॉडल फ्रेमवर्क का निर्माण शुरू कर सकते हैं और इसे उन्नत स्तर पर ले जा सकते हैं, ट्यूटोरियल की आगामी श्रृंखला में हम सेलेनियम फ्रेमवर्क की उन्नत विशेषताओं पर अधिक चर्चा करेंगे। । की श्रृंखला के माध्यम से जाने के लिए सेलेनियम ट्यूटोरियल आप यहाँ से जा सकते हैं।

एक टिप्पणी छोड़ दो