Kerangka Model Objek Halaman Lengkap -2021

Dalam tutorial ini, kita akan belajar tentang Model Objek Halaman, dan juga kita akan merancang dan mengembangkan kerangka Model Objek Halaman dari awal. 

Kami telah membahas semua jenis kerangka kerja di Selenium, termasuk Model Objek Halaman , di sini kita akan membahasnya secara mendalam.

Kami akan merancang dan mengembangkan fitur di bawah ini.

Apa itu desain Kerangka Model Objek Halaman di Selenium  

Model Objek Halaman adalah Model Desain untuk membangun Otomasi pengujian Selenium, di mana kami mendistribusikan seluruh Aplikasi kami yang sedang diuji ke dalam halaman kecil (terkadang halaman web dianggap sebagai halaman, dan terkadang subbagian dari Halaman Web juga dianggap sebagai Halaman ). Masing-masing halaman ini direpresentasikan sebagai kelas Java, dan fungsionalitas halaman ditulis sebagai metode yang berbeda di kelas Java halaman masing-masing.

Katakanlah Anda memiliki aplikasi Gmail yang akan Anda otomatisasi; maka halaman login Gmail ada di mana Anda memiliki beberapa fungsi utama seperti login, membuat akun, dll.

Di sini kita akan membuat kelas java sebagai GmailLoginPage, dan kita akan menulis metode bernama performLogin (), createUserAccount, dll. 

Katakanlah setelah Anda masuk ke akun Gmail Anda, Anda memiliki banyak fitur seperti kotak masuk, item terkirim, sampah, dll. Sekarang di sini, untuk setiap modul, Anda membuat kelas Java dan mempertahankan fungsinya sebagai metode Java di dalam kelas java masing-masing. 

Mengapa Model Objek Halaman

Model Objek Halaman adalah model desain kerangka kerja yang sangat kuat dan canggih di mana Anda dapat menangani bidang-bidang di bawah ini: 

Struktur Kerangka Model Objek Halaman Hibrid

Dalam majalah tutorial sebelumnya, kita memahami Model Objek Halaman hybrid, dan sekarang kami akan merancang dan mengembangkan kerangka kerja.

Arsitektur kerangka kerja Model Objek Halaman

Kita cukup membuat proyek maven dan memasukkan dependensi dalam file POM.xml yang pada awalnya diperlukan untuk kerangka kerja yang terlihat seperti ini: 

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

Setelah itu, kami akan membangun modul kecil dan utilitas, di mana kami telah melampirkan snapshot di bawah ini hanya untuk memberikan wawasan / tampilan tingkat tinggi. Kami akan membangun utilitas satu per satu. 

Kerangka Model Objek Halaman Selenium Structure

Berikut adalah modul di bawah ini yang akan kami kembangkan; kami telah memberikan potongan kode yang sama: 

DriverUtils - Kerangka Model Objek Halaman

Modul ini menyediakan semua utilitas dan dukungan untuk bekerja dengan berbagai browser (Chrome, Firefox, dll.). Utilitas ini didasarkan pada Pabrik pola desain, seperti yang kita bahas di tutorial sebelumnya di sini.

paket com.base.driverUtils; impor org.openqa.selenium.WebDriver; antarmuka publik IDriver { init WebDriver publik (String browserName); }

Implementasi driver lokal, yang akan dieksekusi secara lokal dengan Selenium Webdriver :

paket com.base.driverUtils; impor org.openqa.selenium.WebDriver; impor org.openqa.selenium.chrome.ChromeDriver; impor org.openqa.selenium.firefox.FirefoxDriver; impor org.openqa.selenium.ie.InternetExplorerDriver; public class LocalDriver mengimplementasikan IDriver { public WebDriver init(String browserName) { switch (browserName) { case "firefox": return new FirefoxDriver(); case "chrome": System.setProperty("webdriver.chrome.driver", "..\\DummyAutomation\\DriverExe\\chromedriver.exe"); kembalikan ChromeDriver baru(); case "yaitu": System.setProperty("webdriver.ie.driver", "..\\DummyAutomation\\DriverExe\\IEDriverServer.exe"); kembalikan InternetExplorerDriver() baru; default: kembalikan FirefoxDriver baru(); } } }

Remote Webdriver: Untuk bekerja dengan webdriver jarak jauh (seperti Selenium Grid), Anda memerlukan referensi driver browser jarak jauh, yang seperti ini: 

paket com.base.driverUtils; impor java.net.MalformedURLException; impor java.net.URL; impor org.openqa.selenium.WebDriver; impor org.openqa.selenium.remote.DesiredCapabilities; impor org.openqa.selenium.remote.RemoteWebDriver; kelas publik RemoteDriver mengimplementasikan IDriver { DesiredCapabilities caps; String jarak jauhHuburl; @Override public WebDriver init(String browserName) { switch (browserName) { case "firefox": try { kembalikan RemoteWebDriver baru(URL baru(remoteHuburl), caps.firefox()); } catch (MalformedURLException e2) { // TODO Blok tangkapan yang dibuat secara otomatis e2.printStackTrace(); } case "chrome": try { kembalikan RemoteWebDriver baru(URL baru(remoteHuburl), caps.chrome()); } catch (MalformedURLException e1) { // TODO Blok tangkapan yang dibuat secara otomatis e1.printStackTrace(); } case "yaitu": try { kembalikan RemoteWebDriver baru(URL baru(remoteHuburl), caps.internetExplorer()); } catch (MalformedURLException e) { // TODO Blok tangkapan yang dibuat secara otomatis e.printStackTrace(); } default: try { kembalikan RemoteWebDriver baru(URL baru(remoteHuburl), caps.firefox()); } catch (MalformedURLException e) { // TODO Blok tangkapan yang dibuat secara otomatis e.printStackTrace(); } } mengembalikan nol; } }

Kelas Pengemudi Pabrik: Ini memberi kita objek kelas driver (jarak jauh / lokal) untuk memulai browser pilihan Anda. Kami akan mengambil jenis driver (lokal atau jarak jauh) dan browser (chrome atau firefox dll.) Melalui file konfigurasi (kami telah menggunakan file properti untuk menyimpan konfigurasi, yang akan segera kami bagikan)

paket com.base.driverUtils; public class DriverProvider { public IDriver getDriver(String typeOfDriverExecution){ switch(typeOfDriverExecution){ case "local": return new LocalDriver(); case "remote": kembalikan RemoteDriver baru(); default : mengembalikan LocalDriver baru(); } } }

Sekarang di mana pun Anda memerlukan referensi driver, Anda cukup membuat objek dari objek kelas pabrik (DriverProvider dalam kasus ini) dan dapat memulai instance browser driver.

Ini adalah file konfigurasi yang paling dasar; Anda dapat membuat file properti dan menyimpan nilai seperti ini: 

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

Kerangka Model Objek DataUtils-Page: 

Kami telah merancang utilitas data di sini sebagai pola desain Pabrik yang sama seperti yang kami lakukan dari penerapan modul browser driver.

Berikut adalah potongan kode di bawah ini untuk yang sama; Dalam kerangka kerja, kami telah menunjukkan utilitas Excel dan properti, Anda dapat meningkatkan lebih banyak untuk mendukung utilitas data lain seperti YAML, PDF, dll .: 

The antarmuka begini caranya: 

paket com.base.dataUtils; antarmuka publik IDataProvider { Obyek publik[][] fetchDataSet(String... dataFileInfo); publik String fetchData(String... dataFileInfo); }

Berikut implementasinya untuk Penyedia Data Excel

paket com.base.dataUtils; impor java.io.File; impor java.io.FileInputStream; impor java.io.FileNotFoundException; impor java.io.IOException; impor org.apache.poi.xssf.usermodel.XSSFCell; impor org.apache.poi.xssf.usermodel.XSSFSheet; impor org.apache.poi.xssf.usermodel.XSSFWorkbook; kelas publik ExcelDataProvider mengimplementasikan IDataProvider { FileInputStream fis = null; buku kerja XSSFWorkbook statis pribadi = null; Sel XSSFCell statis pribadi; lembar XSSFSheet statis pribadi; public static String[][] excelDataSet = null; @Override public Object[][] fetchDataSet(String... dataFileInfo) { String excelFilePath = dataFileInfo[0]; String excelSheetName = dataFileInfo[1]; File file = File baru (excelFilePath); coba { fis = new FileInputStream(file); } catch (FileNotFoundException e) { // TODO Blok tangkapan yang dibuat secara otomatis e.printStackTrace(); } coba { workBook = new XSSFWorkbook(fis); } catch (IOException e) { // TODO Blok tangkapan yang dibuat secara otomatis e.printStackTrace(); } lembar = buku kerja.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 (Pengecualian e) { // TODO Blok tangkapan yang dibuat secara otomatis e.printStackTrace(); } } } mengembalikan excelDataSet; } public static String getCellData(int RowNum, int ColNum) throws Exception { try { Cell = sheet.getRow(RowNum).getCell(ColNum); int tipe data = Cell.getCellType(); if (tipe data == 3) { kembali ""; } else if (DataType == XSSFCell.CELL_TYPE_NUMERIC) { int i = (int) Cell.getNumericCellValue(); mengembalikan Integer.toString(i); } else { String CellData = Cell.getStringCellValue(); kembali CellData; } } catch (Pengecualian e) { throw (e); } } @Override public String fetchData(String... dataFileInfo) { // TODO rintisan metode yang dihasilkan secara otomatis mengembalikan null; } }

Penyedia Data Properti: 

paket com.base.dataUtils; impor java.io.FileInputStream; impor java.io.IOException; impor java.util.Properties; kelas publik PropertiesDataProvider mengimplementasikan IDataProvider { FileInputStream fis=null; @Override public Object[][] fetchDataSet(String... dataFileInfo) { // TODO rintisan metode yang dihasilkan secara otomatis mengembalikan null; } @Override public String fetchData(String... dataFileInfo) { String dataValue; String pathToFile = dataFileInfo[0]; Kunci string = dataFileInfo[1]; Properti properti = Properti baru(); coba { fis=new FileInputStream(pathToFile); properties.load(fis); } catch (IOException e) { // TODO Blok tangkapan yang dibuat secara otomatis e.printStackTrace(); } dataValue = properti.getProperty(kunci); mengembalikan nilai data; } }

The kelas pabrik untuk Utilitas data ini

paket com.base.dataUtils; public class DataHelperProvider { public IDataProvider getDataHelperProvider(String typeOfDataHandler) { switch (typeOfDataHandler) { case "excel": return new ExcelDataProvider(); case "properties": kembalikan PropertiesDataProvider() baru; } mengembalikan nol; } }

Utilitas WebAction Kerangka Model Objek Halaman

Dalam utilitas, kami menulis semua utilitas yang terkait dengan tindakan Web Anda seperti (klik, tombol kirim, tangkapan layar, dll.), Dan kami dapat menggunakannya di Metode Halaman untuk melakukan tindakan web untuk mencapai fungsionalitas halaman seperti yang dibahas sebelumnya dalam tutorial ini. 

Berikut adalah potongan kode untuk WebAction Utilities: 

paket com.base.webActionHelperUtils; impor java.util.ArrayList; impor java.util.List; impor java.util.concurrent.TimeUnit; impor org.openqa.selenium.By; impor org.openqa.selenium.WebDriver; impor org.openqa.selenium.WebElement; impor org.openqa.selenium.support.ui.ExpectedConditions; impor org.openqa.selenium.support.ui.WebDriverWait; WebActionsHelperUtils kelas publik { driver WebDriver yang dilindungi; public WebActionsHelperUtils (driver WebDriver) { this.driver = driver; } public void safeClick(Dengan elemen) { waitForElementToBeClickAble(elemen, 30); driver.findElement(elemen).klik(); } Daftar publik getElements(Dengan elemen) { kembali driver.findElements(elemen); } public void waitForWebElementsToBeDisplayed(Berdasarkan elemen, int timeOuts) { WebDriverWait wait = new WebDriverWait(driver, timeOuts); tunggu.sampai(ExpectedConditions.visibilityOfAllElements(getElements(elemen))); } public void waitForElementToBeClickAble(Berdasarkan elemen, int timeOutSeconds) { WebDriverWait waitForElement = new WebDriverWait(driver, timeOutSeconds); waitForElement.until(ExpectedConditions.elementToBeClickable(elemen)); } public void waitForElementToBeDisplayed(Berdasarkan elemen, int timeOuts) { WebDriverWait wait = new WebDriverWait(driver, timeOuts); tunggu.sampai(ExpectedConditions.visibilityOfElementLocated(elemen)); } public void enterTextIntoElement(Dengan elemen, String textToBeEntered) { driver.findElement(elemen).sendKeys(textToBeEntered); } public String getText(Dengan elemen) { kembali driver.findElement(elemen).getText(); } public String getAttribute(Dengan elemen, atribut String) { kembali driver.findElement(elemen).getAttribute(atribut); } public boolean isSelected(Dengan elemen) { boolean isElementSelected = false; if (driver.findElement(element).isSelected() == true) { isElementSelected = true; } kembalikan isElementSelected; } public void clearField(Dengan elemen) { driver.findElement(elemen).clear(); } public void secara implisitTunggu(int timeOuts) { driver.manage().timeouts().implicitlyWait(timeOuts, TimeUnit.SECONDS); } public boolean isElementPresent(Dengan elemen) { coba { driver.findElement(elemen); kembali benar; } catch (Pengecualian e) { return false; } } public void switchToTab(int indexOfTab) { ArrayList tab = ArrayList baru (driver.getWindowHandles()); driver.switchTo().window(tabs.get(indexOfTab)); } }

Utilitas Modul Halaman-Kerangka Model Objek Halaman

Seperti yang kita ketahui, kita harus membuat kelas Halaman dan mempertahankan fungsi halaman dalam metode halaman, jadi sekarang mari kita buat Modul Halaman untuk kerangka Model Objek Halaman: 

Setiap Kelas Halaman lagi memperluas Utils WebAction yang kami kembangkan sekarang dan mengimplementasikan antarmuka Halaman, di mana antarmuka halaman tidak lain adalah antarmuka untuk menyimpan Elemen Web / pelacak halaman masing-masing.

Sekarang Mengapa kita membutuhkan antarmuka untuk menyimpan pencari lokasi: 

Oleh karena itu kami menggunakan antarmuka terpisah untuk pencari halaman terpisah untuk disimpan dengan pendekatan ini; kita menyelesaikan semua pernyataan masalah di atas, yaitu kompleksitas waktu, kompleksitas ruang, dan basis kode yang bersih dan dapat dipelihara seperti dalam antarmuka, kita tidak perlu membuat objek untuk mengakses pencari lokasi.

paket com.base.pageModules; impor java.util.List; impor org.openqa.selenium.By; impor org.openqa.selenium.WebDriver; impor org.openqa.selenium.WebElement; impor com.base.commonUtils.JSonHandler; impor com.base.webActionHelperUtils.WebActionsHelperUtils; impor com.page.locatorModules.HomePageLocators; HomePage kelas publik memperluas WebActionsHelperUtils mengimplementasikan HomePageLocators { JsonHandler jsonHandler = new JSonHandler(); Halaman Beranda publik(pengandar WebDriver) { super(pengemudi); this.driver = pengemudi; } 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) { Daftar elemen = getElements(SUGGESTION_BOX); jsonHandler.captureAndWriteJsonData(elemen, pathToJsonDataStore, searchData); } public void genericWait(int timeOuts) { secara implisitWait(timeOuts); } public void clikcOnSelectedElement(Opsi string) { int optionSelection = Integer.parseInt(opsi); safeClick(By.xpath("//div[@id='s-separator']/following-sibling::div[" + optionSelection + "]")); } }

Demikian juga, Anda dapat terus memasukkan fitur halaman di halaman metode Halaman yang berbeda di dalam kelas halaman masing-masing. 

Berikut ini caranya Antarmuka pencari halaman terlihat seperti : 

paket com.page.locatorModules; impor org.openqa.selenium.By; antarmuka publik HomePageLocators { Oleh SEARCH_BOX=By.id("twotabsearchtextbox"); Oleh SUGGESTION_BOX=Oleh.xpath("//div[@id='saran']/div"); }

Sekarang segmen berikutnya, Anda dapat membuat baseSetUp atau Basetest di mana Anda ingin melakukan inisialisasi / bagian pemuatan data. Juga, Anda bisa menggunakan @beforeTest, @beoforeClass metode di kelas ini sendiri dan menggunakannya di kelas pengujian Anda.

Pengaturan Dasar Kelas terlihat seperti: 

paket com.demo.testS; impor org.openqa.selenium.WebDriver; impor org.testng.annotations.DataProvider; impor com.base.dataUtils.DataHelperProvider; impor com.base.dataUtils.IDataProvider; impor com.base.driverUtils.DriverProvider; BaseSetUp kelas publik { driver WebDriver publik; DriverProvider browserProvider = new DriverProvider(); DataHelperProvider datahelperProvider = new DataHelperProvider(); IDataProvider dataProvider = datahelperProvider.getDataHelperProvider("properties"); IDataProvider dataProviderExcel = datahelperProvider.getDataHelperProvider("excel"); public String configProperties = "..\\DummyAutomation\\TestConfigsData\\config.properties"; url String publik = 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() { kembalikan driver; } protected void setDriver() { driver = browserProvider.getDriver(modeOfExecution).init(browserName); } @DataProvider(name = "SearchFunctionality") public Object[][] getCityDetails() { Object[][] arrayObject = dataProviderExcel.fetchDataSet(pathToExcelData, "DataFeed"); kembali arrayObject; } }

Kelas Tes: Karena kami akan menggunakan TestNG di sini, jadi Anda perlu menulis metode @test agar skrip pengujian dapat dikembangkan, seperti: 

Berikut adalah potongan kode untuk Kelas Tes  

paket com.demo.testS; impor org.testng.annotations.AfterMethod; impor org.testng.annotations.BeforeMethod; impor org.testng.annotations.Test; impor com.base.pageModules.HomePage; impor com.base.pageModules.SearchPage; DemoTest kelas publik memperluas BaseSetUp { HomePage homePage; CariHalaman pencarianHalaman; @BeforeMethod public void setUpTest() { setDriver(); homePage = HomePage baru(driver); searchPage = Halaman Pencarian baru(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(); } } }

File TestNgXML Kerangka Model Objek Halaman

Anda perlu mendefinisikan kelas XML untuk testng.xml, yang pada dasarnya merupakan kerangka kerja pengujian unit dan mengontrol aliran otomatisasi Anda; Anda dapat menyebutkan kelas tes di sana sendiri.







Jadi dengan aktivitas ini, dasar Anda Model Objek Halaman kerangka kerja harus siap sekarang. Jika Anda ingin mencapai versi lanjutan dari kerangka kerja Anda, maka Anda dapat menggabungkan area di bawah ini: 

Melaporkan Kerangka Model Objek Halaman Fitur

Anda dapat menggunakan fitur pelaporan apa pun yang tersedia seperti daya pikat, laporan luas, laporan TestNG, atau laporan lanjutan dengan menggunakan Tumpukan ELK, dan sebagainya 

Hanya untuk menjaga kesederhanaan, di sini kami menampilkan fitur pelaporan dengan Laporan Luas, yang memiliki banyak fitur bersamanya dan dapat dianggap sebagai pelaporan tingkat menengah. 

Anda harus membangun kelas agar memiliki utilitas untuk bekerja dengan laporan Extent, dan saat melakukannya, Anda harus menerapkan antarmuka ITestlistener dari TestNg; kode di bawah ini menunjukkan bagaimana: 

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

Kesimpulan: Dengan ini kami menyimpulkan pengembangan kerangka Model Objek Halaman Selenium di mana Anda dapat mulai membangun kerangka model Objek Halaman dan dapat membawanya ke tingkat mahir, dalam seri tutorial yang akan datang kita akan membahas lebih lanjut tentang fitur-fitur lanjutan kerangka Selenium . Untuk melewati rangkaian Tutorial selenium bisa anda melalui disini.

Tinggalkan Komentar

Alamat email Anda tidak akan dipublikasikan. Bidang yang harus diisi ditandai *

Gulir ke Atas