Kompletní rámec objektového modelu stránky -2021

V tomto tutoriálu se dozvíme o Page Object Modelu a také od základu navrhneme a vyvineme framework Page Object Model. 

Diskutovali jsme o všem typy rámce v selenu, včetně Page Object Model , tady bychom prošli do hloubky.

Navrhneme a vyvineme níže uvedené funkce.

Co je návrh rámce Page Object Model Framework v selenu  

Model objektu stránky je Design Model pro budování automatizace testů Selenium, kde distribuujeme celou naši testovanou aplikaci do malých stránek (někdy je webová stránka považována za stránku a někdy je část webové stránky považována také za stránku). Každá z těchto stránek je reprezentována jako třída Java a funkce stránek jsou zapsány jako různé metody v příslušné třídě Java stránky.

Řekněme, že máte aplikaci Gmail, kterou budete automatizovat; proto je přihlašovací stránka Gmailu tam, kde máte několik hlavních funkcí, jako je přihlášení, vytvoření účtu atd.

Zde vytvoříme třídu Java jako GmailLoginPage a budeme psát metody pojmenované jako performLogin (), createUserAccount atd. 

Řekněme, že jakmile jste přihlášeni ke svému účtu Gmail, máte mnoho funkcí, jako je doručená pošta, odeslané položky, koše atd. Nyní zde pro každý modul vytvoříte třídu Java a zachováte její funkce jako metody Java uvnitř příslušných tříd Java. 

Proč stránkový objektový model

Page Object Model je velmi robustní a pokročilý model návrhu rámce, kde se můžete postarat o následující oblasti: 

Struktura rámce hybridního objektového modelu stránky

v v předchozím tutoriálu jsme porozuměli hybridnímu modelu Object Object, a nyní navrhneme a vyvineme rámec.

Architektura rámce Page Object Model

Můžeme jednoduše vytvořit projekt maven a začlenit závislosti do souboru POM.xml, který je původně vyžadován pro framework, který vypadá takto: 

<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>

Poté sestavíme malé moduly a obslužné programy, ke kterým jsme níže připojili tento snímek, abychom poskytli přehledy / zobrazení na vysoké úrovni. Budeme budovat utility jeden po druhém. 

Zde jsou níže uvedené moduly, které budeme vyvíjet; poskytli jsme fragment kódu pro stejné: 

DriverUtils - Stránka Object Framework Framework

Tento modul poskytuje všechny nástroje a podporu pro práci s různými prohlížeči (Chrome, Firefox atd.). Tento nástroj je založen na Factory návrhový vzor, jak jsme probrali v předchozím tutoriálu zde.

balíček com.base.driverUtils; import org.openqa.selenium.WebDriver; public interface IDriver { public WebDriver init(String browserName); }

Implementace Localdriver, která se spustí lokálně s Selénový webdriver :

balíček 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 implementuje IDriver {
  public WebDriver init(String browserName) {
     switch (browserName) {
     případ "firefox":
        vrátit nový FirefoxDriver();
     pouzdro "chrome":
        System.setProperty("webdriver.chrome.driver",
              "..\\\\DummyAutomation\\\\DriverExe\\\\chromedriver.exe");
        vrátit nový ChromeDriver();
     případ "tj":
        System.setProperty("webdriver.ie.driver",
              "..\\\\DummyAutomation\\\\DriverExe\\\\IEDriverServer.exe");
        vrátit nový InternetExplorerDriver();
     výchozí:
        vrátit nový FirefoxDriver();
     }
  }
}

Vzdálený webový ovladač: Chcete-li pracovat se vzdáleným webovým ovladačem (například Selenium Grid), potřebujete vzdálený odkaz na ovladač prohlížeče, který vypadá takto: 

balíček 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 implementuje 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 Automaticky generovaný blok catch e2.printStackTrace(); } case "chrome": try { return new RemoteWebDriver(new URL(remoteHuburl), caps.chrome()); } catch (MalformedURLException e1) { // TODO Automaticky generovaný blok catch e1.printStackTrace(); } case "ie": try { return new RemoteWebDriver(new URL(remoteHuburl), caps.internetExplorer()); } catch (MalformedURLException e) { // TODO Automaticky generovaný blok catch e.printStackTrace(); } výchozí: try { return new RemoteWebDriver(new URL(remoteHuburl), caps.firefox()); } catch (MalformedURLException e) { // TODO Automaticky generovaný blok catch e.printStackTrace(); } } return null; } }

Třída továrního ovladače: To nám poskytuje objekt třídy ovladače (vzdálený / lokální) k zahájení prohlížečů podle vašeho výběru. Prostřednictvím konfiguračního souboru provedeme typ ovladače (místní nebo vzdálený) a prohlížeče (chrom nebo firefox atd.) (K zachování konfigurací jsme použili soubor vlastností, který brzy sdílíme)

balíček 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(); } } }

Nyní, kdekoli budete potřebovat odkaz na ovladač, můžete jednoduše vytvořit objekt objektu tovární třídy (v tomto případě DriverProvider) a můžete zahájit instanci prohlížeče ovladače.

Zde je velmi základní konfigurační soubor; můžete vytvořit soubor vlastností a uložit hodnoty takto: 

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

Rámec objektového modelu DataUtils-Page: 

Datové nástroje jsme zde navrhli jako stejný vzor návrhu Factory, jaký jsme vytvořili při implementaci modulů prohlížeče ovladačů.

Zde je níže uvedený fragment kódu; v rámci jsme ukázali nástroje Excel a vlastnosti Utils, můžete vylepšit další podporu dalších datových nástrojů jako YAML, PDF atd .: 

Projekt rozhraní tady jde takto: 

balíček com.base.dataUtils; public interface IDataProvider { public Object[][] fetchDataSet(String... dataFileInfo); public String fetchData(String... dataFileInfo); }

Zde je implementace pro Poskytovatel dat Excel

balíček 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 implementuje IDataProvider { FileInputStream fis = null; soukromý statický XSSFWorkbook sešit = null; soukromá statická buňka XSSFCell; soukromý statický list XSSFSheet; public static String[][] excelDataSet = null; @Override public Object[][] fetchDataSet(String... dataFileInfo) { String excelFilePath = dataFileInfo[0]; Řetězec excelSheetName = dataFileInfo[1]; Soubor soubor = new File(excelFilePath); try { fis = new FileInputStream(soubor); } catch (FileNotFoundException e) { // TODO Automaticky generovaný blok catch e.printStackTrace(); } try { workBook = new XSSFWorkbook(fis); } catch (IOException e) { // TODO Automaticky generovaný blok catch e.printStackTrace(); } list = workBook.getSheet(excelSheetName); int ci, cj; int rowCount = list.getLastRowNum(); int totalCols = list.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 (Výjimka e) { // TODO Automaticky generovaný blok catch e.printStackTrace(); } } } return excelDataSet; } public static String getCellData(int RowNum, int ColNum) vyvolá výjimku { try { Cell = list.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 (Výjimka e) { throw (e); } } @Override public String fetchData(String... dataFileInfo) { // TODO Automaticky generovaná metoda stub return null; } }

Vlastnosti Poskytovatel dat: 

balíček com.base.dataUtils; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; public class PropertiesDataProvider implementuje IDataProvider { FileInputStream fis=null; @Override public Object[][] fetchDataSet(String... dataFileInfo) { // TODO Automaticky generovaná metoda stub return null; } @Override public String fetchData(String... dataFileInfo) { String dataValue; String pathToFile = dataFileInfo[0]; Klíč řetězce = dataFileInfo[1]; Vlastnosti vlastnosti = new Properties(); try { fis=new FileInputStream(pathToFile); vlastnosti.zatížení(fis); } catch (IOException e) { // TODO Automaticky generovaný blok catch e.printStackTrace(); } dataValue = vlastnosti.getProperty(klíč); return dataValue; } }

Projekt tovární třída pro tyto datové nástroje

balíček 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; } }

Obslužné programy WebAction - Rámec objektového modelu stránky

V obslužných programech píšeme všechny obslužné programy související s vašimi webovými akcemi, jako jsou (kliknutí, sendkeys, screenshoty atd.) A můžeme je použít v metodách stránky k provádění webových akcí k dosažení funkcí stránky, jak je popsáno výše v tomto kurzu. 

Tady je fragment kódu pro nástroje WebAction Utilities: 

balíček 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 { chráněný ovladač WebDriver; public WebActionsHelperUtils(ovladač WebDriver) { this.driver = ovladač; } public void safeClick(Podle prvku) { waitForElementToBeClickAble(element, 30); driver.findElement(element).click(); } veřejný seznam 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(Podle prvku, int timeOutSeconds) { WebDriverWait waitForElement = new WebDriverWait(driver, timeOutSeconds); waitForElement.until(ExpectedConditions.elementToBeClickable(element)); } public void waitForElementToBeDisplayed(Podle prvku, int timeOuts) { WebDriverWait wait = new WebDriverWait(driver, timeOuts); wait.until(ExpectedConditions.visibilityOfElementLocated(element)); } public void enterTextIntoElement(Podle prvku, String textToBeEntered) { driver.findElement(element).sendKeys(textToBeEntered); } public String getText(Podle prvku) { return driver.findElement(element).getText(); } public String getAttribute(Podle elementu, String atribut) { return driver.findElement(element).getAttribute(atribute); } public boolean isSelected(By element) { boolean isElementSelected = false; if (driver.findElement(element).isSelected() == true) { isElementSelected = true; } return isElementSelected; } public void clearField(Podle prvku) { driver.findElement(element).clear(); } public void implicitlyWait(int timeOuts) { driver.manage().timeouts().implicitlyWait(timeOuts, TimeUnit.SECONDS); } public boolean isElementPresent(Podle prvku) { try { driver.findElement(element); vrátit true; } catch (výjimka e) { return false; } } public void switchToTab(int indexOfTab) { ArrayList tabs = nový ArrayList (driver.getWindowHandles()); driver.switchTo().window(tabs.get(indexOfTab)); } }

Nástroje stránkového modulu - Rámec objektového modelu stránky

Jak víme, musíme vytvořit třídu Page a zachovat funkčnost stránky v metodách stránky, takže nyní vytvořme modul Page pro rámec modelu modelu objektu stránky: 

Každá třída stránek znovu rozšiřuje nástroje WebAction Utils které jsme vyvinuli právě teď a implementuje rozhraní stránky, kde rozhraní stránky nejsou nic jiného než rozhraní pro zachování webových prvků / lokátorů příslušné stránky.

Proč potřebujeme rozhraní pro uložení lokátorů: 

Proto jsme použili samostatná rozhraní pro samostatné vyhledávače stránek, které jsme ukládali tímto přístupem; řešíme všechny výše uvedené problémové příkazy, kterými jsou časová složitost, prostorová složitost a čistý a udržovatelný kódový základ jako v rozhraních, nemusíme vytvářet objekty pro přístup k lokátorům.

balíček 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; importovat com.base.webActionHelperUtils.WebActionsHelperUtils; importovat com.page.locatorModules.HomePageLocators; public class HomePage rozšiřuje WebActionsHelperUtils implementuje HomePageLocators { JSonHandler jsonHandler = new JSonHandler(); public HomePage(ovladac WebDriver) { super(ovladac); this.driver = řidič; } 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 elementy = getElements(SUGGESTION_BOX); jsonHandler.captureAndWriteJsonData(prvky, cestaToJsonDataStore, searchData); } public void genericWait(int timeOuts) { implicitlyWait(timeOuts); } public void clikcOnSelectedElement(volba řetězce) { int volbaSelection = Integer.parseInt(volba); safeClick(By.xpath("//div[@id='s-separator']/following-sibling::div[" + optionSelection + "]")); } }

Podobně můžete pokračovat v zahrnutí funkcí stránky do různých metod stránky uvnitř příslušných tříd stránek. 

Zde je, jak Rozhraní lokátorů stránek vypadat jako: 

balíček com.page.locatorModules; import org.openqa.selenium.By; veřejné rozhraní HomePageLocators { By SEARCH_BOX=By.id("twotabsearchtextbox"); By SUGGESTION_BOX=By.xpath("//div[@id='suggestions']/div"); }

Nyní další segment, můžete vytvořit baseSetUp nebo Basetest, kde chcete provést inicializaci / načítání dat. Také můžete použít @beforeTest, @beoforeClass metody v této třídě samotné a používat je ve svých testovacích třídách.

Základní nastavení Třída vypadá takto: 

balíček 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 {
\tpublic ovladač WebDriver;
\tDriverProvider browserProvider = new DriverProvider();
\tDataHelperProvider datahelperProvider = new DataHelperProvider();
\tIDataProvider dataProvider = datahelperProvider.getDataHelperProvider("properties");
\tIDataProvider dataProviderExcel = datahelperProvider.getDataHelperProvider("excel");
\tpublic final String configProperties = "..\\\\DummyAutomation\\\\TestConfigsData\\\\config.properties";
\tpublic String url = dataProvider.fetchData(configProperties, "url");
\tString modeOfExecution = dataProvider.fetchData(configProperties, "modeOfExecution");
\tString název_prohlížeče = dataProvider.fetchData(configProperties, "prohlížeč");
\tString pathToJasonDataStore = "..\\\\DummyAutomation\\\\ProductJsonData\\\\";
\tString pathToExcelData = "..\\\\DummyAutomation\\\\TestConfigsData\\\\TestData.xlsx";
\tpublic WebDriver getDriver() {
\t\treturn driver;
\t}
\tprotected void setDriver() {
\t\tdriver = browserProvider.getDriver(modeOfExecution).init(browserName);
\t}
\t@DataProvider(name = "Funkčnost vyhledávání")
\tpublic Object[][] getCityDetails() {
\t\tObject[][] arrayObject = dataProviderExcel.fetchDataSet(pathToExcelData, "DataFeed");
\t\treturn arrayObject;
\t}
}

Testovací třídy: Protože bychom zde používali TestNG, musíte pro vývoj testovacího skriptu napsat metodu @test, například: 

Tady je fragment kódu pro testovací třídy  

balíček com.demo.testS; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; importovat com.base.pageModules.HomePage; import com.base.pageModules.SearchPage; public class DemoTest rozšiřuje BaseSetUp { HomePage homePage; SearchPage searchPage; @BeforeMethod public void setUpTest() { setDriver(); homePage = new HomePage(driver); searchPage = new SearchPage(ovladač); homePage.navigatToUrl(); } @Test(dataProvider = "Functionality Search") 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 (ovladac != null) { driver.quit(); } } }

Soubor TestNgXML - Rámec objektového modelu stránky

Budete muset definovat třídu XML pro testng.xml, což je v zásadě testovací rámec jednotek a řídí tok vaší automatizace; můžete zmínit samotné testovací třídy.







Takže s těmito aktivitami, vaše základní Model objektu stránky rámec by měl být připraven hned. Pokud chcete dosáhnout pokročilé verze svého rámce, můžete začlenit tyto níže uvedené oblasti: 

Hlášení Rámec objektových modelů objektových modelů

Můžete použít jakoukoli dostupnou funkci hlášení jako lákadlo, report o rozsahu, zpráva TestNG nebo hlášení předem pomocí Stoh ELK, atd. 

Abychom zachovali jednoduchost, zobrazujeme zde funkci vytváření sestav pomocí zprávy o rozsahu, která má mnoho funkcí a lze ji považovat za střední úroveň vykazování. 

Musíte vytvořit třídu, abyste měli nástroje pro práci se zprávou o rozsahu, a přitom musíte implementovat interface ITestlistener od TestNg; níže uvedený kód ukazuje, jak: 

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
  }
}

Závěr: Tímto uzavíráme vývoj rámce modelu Selenium Page Object Model, pomocí kterého můžete začít budovat rámec modelu Page Object Model a posunout ho na pokročilou úroveň, v nadcházející sérii tutoriálu budeme diskutovat více o pokročilých funkcích Selenium framework . Projít sérií Výukový program pro selen, který můžete projít zde.

Zanechat komentář