पूरा पृष्ठ ऑब्जेक्ट मॉडल फ्रेमवर्क -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"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

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

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

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

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

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

पूरा पृष्ठ ऑब्जेक्ट मॉडल फ्रेमवर्क -2021
सेलेनियम पेज ऑब्जेक्ट मॉडल फ्रेमवर्क संरचना

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

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

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

package com.base.driverUtils;

import org.openqa.selenium.WebDriver;

public interface IDriver {

  public WebDriver init(String browserName);
}

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

package com.base.driverUtils;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;

public class LocalDriver implements IDriver {

  public WebDriver init(String browserName) {
     switch (browserName) {
     case "firefox":
        return new FirefoxDriver();

     case "chrome":
        System.setProperty("webdriver.chrome.driver",
              "..\\DummyAutomation\\DriverExe\\chromedriver.exe");
        return new ChromeDriver();

     case "ie":
        System.setProperty("webdriver.ie.driver",
              "..\\DummyAutomation\\DriverExe\\IEDriverServer.exe");
        return new InternetExplorerDriver();
     default:
        return new FirefoxDriver();
     }
  }

}

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

package com.base.driverUtils;

import java.net.MalformedURLException;
import java.net.URL;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

public class RemoteDriver implements IDriver {

  DesiredCapabilities caps;
  String remoteHuburl;

  @Override
  public WebDriver init(String browserName) {
     switch (browserName) {
     case "firefox":
        try {
           return new RemoteWebDriver(new URL(remoteHuburl), caps.firefox());
        } catch (MalformedURLException e2) {
           // TODO Auto-generated catch block
           e2.printStackTrace();
        }
     case "chrome":
        try {
           return new RemoteWebDriver(new URL(remoteHuburl), caps.chrome());
        } catch (MalformedURLException e1) {
           // TODO Auto-generated catch block
           e1.printStackTrace();
        }
     case "ie":
        try {
           return new RemoteWebDriver(new URL(remoteHuburl), caps.internetExplorer());
        } catch (MalformedURLException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
        }
     default:
        try {
           return new RemoteWebDriver(new URL(remoteHuburl), caps.firefox());
        } catch (MalformedURLException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
        }
     }
     return null;
  }
 

}

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

package com.base.driverUtils;

public class DriverProvider {

  public IDriver getDriver(String typeOfDriverExecution){
     switch(typeOfDriverExecution){
     case "local":
        return new LocalDriver();
     case "remote":
        return new RemoteDriver();
     default :
        return new LocalDriver();
     }
  }
}

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

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

modeOfExecution=local
browser=chrome
url=http://www.applicationUrl.com/

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

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

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

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

package com.base.dataUtils;

public interface IDataProvider {

  public Object[][] fetchDataSet(String... dataFileInfo);
  public String fetchData(String... dataFileInfo);
}

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

package com.base.dataUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelDataProvider implements IDataProvider {

  FileInputStream fis = null;
  private static XSSFWorkbook workBook = null;
  private static XSSFCell Cell;
  private static XSSFSheet sheet;

  public static String[][] excelDataSet = null;

  @Override
  public Object[][] fetchDataSet(String... dataFileInfo) {
     String excelFilePath = dataFileInfo[0];
     String excelSheetName = dataFileInfo[1];
     File file = new File(excelFilePath);

     try {
        fis = new FileInputStream(file);
     } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
     }
     try {
        workBook = new XSSFWorkbook(fis);
     } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
     }
     sheet = workBook.getSheet(excelSheetName);
     int ci, cj;
     int rowCount = sheet.getLastRowNum();
     int totalCols = sheet.getRow(0).getPhysicalNumberOfCells();
     excelDataSet = new String[rowCount][totalCols - 1];
     ci = 0;
     for (int i = 1; i <= rowCount; i++, ci++) {
        cj = 0;
        for (int j = 1; j <= totalCols - 1; j++, cj++) {

           try {
              excelDataSet[ci][cj] = getCellData(i, j);
           } catch (Exception e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
           }
        }
     }
     return excelDataSet;

  }

  public static String getCellData(int RowNum, int ColNum) throws Exception {

     try {

        Cell = sheet.getRow(RowNum).getCell(ColNum);

        int dataType = Cell.getCellType();

        if (dataType == 3) {

           return "";

        }

        else if (dataType == XSSFCell.CELL_TYPE_NUMERIC) {
           int i = (int) Cell.getNumericCellValue();
           return Integer.toString(i);
        }

        else {

           String CellData = Cell.getStringCellValue();

           return CellData;

        }
     } catch (Exception e) {

        throw (e);

     }

  }

  @Override
  public String fetchData(String... dataFileInfo) {
     // TODO Auto-generated method stub
     return null;
  }

}

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

package com.base.dataUtils;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class PropertiesDataProvider implements IDataProvider {

  FileInputStream fis=null;

  @Override
  public Object[][] fetchDataSet(String... dataFileInfo) {
     // TODO Auto-generated method stub
     return null;
  }

  @Override
  public String fetchData(String... dataFileInfo) {

     String dataValue;
     String pathToFile = dataFileInfo[0];
     String key = dataFileInfo[1];
     Properties properties = new Properties();
     try {
        fis=new FileInputStream(pathToFile);
        properties.load(fis);
     } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
     }
     dataValue = properties.getProperty(key);
     return dataValue;
  }

}

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

package com.base.dataUtils;

public class DataHelperProvider {

  public IDataProvider getDataHelperProvider(String typeOfDataHandler) {
     switch (typeOfDataHandler) {
     case "excel":
        return new ExcelDataProvider();
     case "properties":
        return new PropertiesDataProvider();
     }
     return null;

  }
}

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

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

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

package com.base.webActionHelperUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;


public class WebActionsHelperUtils {

  protected WebDriver driver;

  public WebActionsHelperUtils(WebDriver driver) {

     this.driver = driver;
  }

  public void safeClick(By element) {

     waitForElementToBeClickAble(element, 30);
     driver.findElement(element).click();
  }

  public List<WebElement> getElements(By elements) {
     return driver.findElements(elements);
  }

  public void waitForWebElementsToBeDisplayed(By elements, int timeOuts) {
     WebDriverWait wait = new WebDriverWait(driver, timeOuts);
     wait.until(ExpectedConditions.visibilityOfAllElements(getElements(elements)));
  }

  public void waitForElementToBeClickAble(By element, int timeOutSeconds) {
     WebDriverWait waitForElement = new WebDriverWait(driver, timeOutSeconds);
     waitForElement.until(ExpectedConditions.elementToBeClickable(element));
  }

  public void waitForElementToBeDisplayed(By element, int timeOuts) {
     WebDriverWait wait = new WebDriverWait(driver, timeOuts);
     wait.until(ExpectedConditions.visibilityOfElementLocated(element));
  }

  public void enterTextIntoElement(By element, String textToBeEntered) {
     driver.findElement(element).sendKeys(textToBeEntered);
  }

  public String getText(By element) {
     return driver.findElement(element).getText();

  }

  public String getAttribute(By element, String attribute) {
     return driver.findElement(element).getAttribute(attribute);
  }

  public boolean isSelected(By element) {
     boolean isElementSelected = false;
     if (driver.findElement(element).isSelected() == true) {
        isElementSelected = true;
     }
     return isElementSelected;
  }

  public void clearField(By element) {
     driver.findElement(element).clear();
  }

  public void implicitlyWait(int timeOuts) {
     driver.manage().timeouts().implicitlyWait(timeOuts, TimeUnit.SECONDS);
  }

  public boolean isElementPresent(By element) {
     try {
        driver.findElement(element);
        return true;
     } catch (Exception e) {
        return false;
     }
  }

  public void switchToTab(int indexOfTab) {
     ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
     driver.switchTo().window(tabs.get(indexOfTab));

  }
}

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

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

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

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

  • हम वहां से लोकेटर रखने के लिए किसी भी गुण / एक्सेल फाइल का उपयोग कर सकते हैं, लेकिन इस दृष्टिकोण में, हमें हर बार लोकेटर लाने का इरादा है, हम इसे उन पेज विधियों में उपयोग करने का इरादा रखते हैं जहां समय जटिलता बढ़ जाएगी, इसलिए हमने स्टोर नहीं किया फ़ाइलों में लोकेटर। 
  • हम एक ही वर्ग का उपयोग कर सकते हैं (@findBy एनोटेशन के साथ पेज फैक्ट्री कार्यान्वयन के साथ पेजक्लास), लेकिन हमने इस क्लासिक पेज ऑब्जेक्ट मॉडल का उपयोग नहीं किया क्योंकि संबंधित पेज क्लास में संबंधित लोकेटरों को संग्रहीत करना, कोड अपठनीय और अनाड़ी होगा, हम अलग करना चाहते थे कोड से स्वच्छ कोडबेस और रखरखाव और डिबगिंग और पुन: प्रयोज्य को बनाए रखने के लिए कोड के निवासी भी इस दृष्टिकोण में बढ़ जाएंगे।
  • हम अलग-अलग कक्षाओं में लोकेटरों को स्टोर कर सकते थे, लेकिन कॉल करने के कारण हमने ऐसा नहीं किया "एन" पृष्ठ लोकेटर कक्षाएं, हमें वर्गीकृत किए गए लोकेटर की वस्तुओं की "एन" संख्या बनाना था; इसलिए अंतरिक्ष जटिलता प्रभावित होगी।

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

package com.base.pageModules;

import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import com.base.commonUtils.JSonHandler;
import com.base.webActionHelperUtils.WebActionsHelperUtils;
import com.page.locatorModules.HomePageLocators;

public class HomePage extends WebActionsHelperUtils implements HomePageLocators {

  JSonHandler jsonHandler = new JSonHandler();

  public HomePage(WebDriver driver) {
     super(driver);
     this.driver = driver;
  }

  public void enterSearchdataToSearchField(String searchData) {

     waitForElementToBeClickAble(SEARCH_BOX, 10);
     enterTextIntoElement(SEARCH_BOX, searchData);

  }

  public void navigatToUrl() {
     driver.get(url);
  }

  public void captureSearchSuggestion(String pathToJsonDataStore, String searchData) {
     List<WebElement> elements = getElements(SUGGESTION_BOX);
     jsonHandler.captureAndWriteJsonData(elements, pathToJsonDataStore, searchData);
  }

  public void genericWait(int timeOuts) {
     implicitlyWait(timeOuts);
  }

  public void clikcOnSelectedElement(String option) {
     int optionSelection = Integer.parseInt(option);
     safeClick(By.xpath("//div[@id='s-separator']/following-sibling::div[" + optionSelection + "]"));
  }

}

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

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

package com.page.locatorModules;

import org.openqa.selenium.By;

public interface HomePageLocators {

 
  By SEARCH_BOX=By.id("twotabsearchtextbox");
  By SUGGESTION_BOX=By.xpath("//div[@id='suggestions']/div");
 
}

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

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

package com.demo.testS;

import org.openqa.selenium.WebDriver;
import org.testng.annotations.DataProvider;

import com.base.dataUtils.DataHelperProvider;
import com.base.dataUtils.IDataProvider;
import com.base.driverUtils.DriverProvider;

public class BaseSetUp {

	public WebDriver driver;
	DriverProvider browserProvider = new DriverProvider();
	DataHelperProvider datahelperProvider = new DataHelperProvider();
	IDataProvider dataProvider = datahelperProvider.getDataHelperProvider("properties");
	IDataProvider dataProviderExcel = datahelperProvider.getDataHelperProvider("excel");
	public final String configProperties = "..\\DummyAutomation\\TestConfigsData\\config.properties";
	public String url = dataProvider.fetchData(configProperties, "url");
	String modeOfExecution = dataProvider.fetchData(configProperties, "modeOfExecution");
	String browserName = dataProvider.fetchData(configProperties, "browser");
	String pathToJasonDataStore = "..\\DummyAutomation\\ProductJsonData\\";
	String pathToExcelData = "..\\DummyAutomation\\TestConfigsData\\TestData.xlsx";

	public WebDriver getDriver() {
		return driver;
	}

	protected void setDriver() {
		driver = browserProvider.getDriver(modeOfExecution).init(browserName);
	}

	@DataProvider(name = "SearchFunctionality")
	public Object[][] getCityDetails() {
		Object[][] arrayObject = dataProviderExcel.fetchDataSet(pathToExcelData, "DataFeed");
		return arrayObject;
	}
}

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

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

package com.demo.testS;

import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import com.base.pageModules.HomePage;
import com.base.pageModules.SearchPage;

public class DemoTest extends BaseSetUp {

  HomePage homePage;
  SearchPage searchPage;

  @BeforeMethod
  public void setUpTest() {
     setDriver();
     homePage = new HomePage(driver);
     searchPage = new SearchPage(driver);
     homePage.navigatToUrl();
  }

  @Test(dataProvider = "SearchFunctionality")
  public void search(String searchData, String selectOption) {
     homePage.enterSearchdataToSearchField(searchData);
     homePage.genericWait(5);
     homePage.captureSearchSuggestion(pathToJasonDataStore, searchData);
     homePage.clikcOnSelectedElement(selectOption);
     searchPage.clickOnFirstProduct();
     searchPage.switchToProductSpecificPage();
     searchPage.captureProductData(pathToJasonDataStore, searchData);

  }

  @AfterMethod
  public void tearDown() {
     if (driver != null) {
        driver.quit();
     }
  }

}

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

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

<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="test-parameter" parallel="tests" thread-count="3">

<test name="DemoAutomation_TarGet">
<classes>
<class name="com.demo.testS.DemoTest"></class>

</classes>
</test>
</suite>

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

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

आप उपलब्ध किसी भी रिपोर्टिंग सुविधा का उपयोग कर सकते हैं लुभाना, विस्तारक, 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 ="{\n" +
           "   \"testCaseNumber\" : \""+testCaseNumber+"\",\n" +
           "   \"status\" : \""+status+"\",\n" +
           "   \"testDescription\" : \""+testDesc+"\",\n" +
           "   \"exceptionType\" : \""+exceptionType+"\",\n" +
           "   \"detailedError\":\""+detailedError+"\"\n" +
           "   \n" +
           "}";

     

  }

  @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 ="{\n" +
           "   \"testCaseNumber\" : \""+testCaseNumber+"\",\n" +
           "   \"status\" : \""+status+"\",\n" +
           "   \"testDescription\" : \""+testDesc+"\",\n" +
           "   \"exceptionType\" : \""+exceptionType+"\",\n" +
           "   \"detailedError\":\""+detailedError+"\"\n" +
           "   \n" +
           "}";

    
     // 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 ="{\n" +
           "   \"testCaseNumber\" : \""+testCaseNumber+"\",\n" +
           "   \"status\" : \""+status+"\",\n" +
           "   \"testDescription\" : \""+testDesc+"\",\n" +
           "   \"exceptionType\" : \""+exceptionType+"\",\n" +
           "   \"detailedError\":\""+detailedError+"\"\n" +
           "   \n" +
           "}";

  }

  @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

  }
}

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

देबर्घ्य के बारे में

पूरा पृष्ठ ऑब्जेक्ट मॉडल फ्रेमवर्क -2021स्वंय देवबर्घ्य रॉय, मैं एक इंजीनियरिंग शाखा हूं, जो 5 कंपनी और एक ओपन सोर्स योगदानकर्ता के साथ काम कर रही है, जिसके पास विभिन्न टेक्नोलॉजी स्टैक में 12 साल का अनुभव / विशेषज्ञता है।
मैंने जावा, सी #, पायथन, ग्रूवी, यूआई ऑटोमेशन (सेलेनियम), मोबाइल ऑटोमेशन (एपियम), एपीआई/बैकएंड ऑटोमेशन, परफॉर्मेंस इंजीनियरिंग (जेएमटर, टिड्डी), सुरक्षा ऑटोमेशन (मोबएसएफ, ओडब्ल्यूएएसपी, काली लिनक्स) जैसी विभिन्न तकनीकों के साथ काम किया है। , एस्ट्रा, जैप आदि), आरपीए, प्रोसेस इंजीनियरिंग ऑटोमेशन, मेनफ्रेम ऑटोमेशन, स्प्रिंगबूट के साथ बैक एंड डेवलपमेंट, काफ्का, रेडिस, रैबिटएमक्यू, ईएलके स्टैक, ग्रेलॉग, जेनकिंस और क्लाउड टेक्नोलॉजीज, देवओप्स आदि में भी अनुभव है।
मैं अपनी पत्नी के साथ बैंगलोर, भारत में रहता हूं और ब्लॉगिंग, संगीत, गिटार बजाने का शौक रखता हूं और मेरे जीवन का दर्शन सभी के लिए शिक्षा है जिसने लैम्ब्डागीक्स को जन्म दिया। आइए लिंक्ड-इन पर कनेक्ट करें - https://www.linkedin.com/in/debarghya-roy/

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

आपका ईमेल पता प्रकाशित नहीं किया जाएगा। आवश्यक फ़ील्ड चिन्हित हैं *

en English
X