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.

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.