page object model with page factory selenium tutorial
Ovaj produbljeni vodič objašnjava sve o objektnom modelu stranice (POM) s primjerima Pagefactory-a. Također možete naučiti provedbu POM-a u selenu:
U ovom uputstvu razumjet ćemo kako stvoriti model objekta stranice pomoću pristupa tvornice stranica. Usredotočit ćemo se na:
- Tvornička klasa
- Kako stvoriti osnovni POM koristeći obrazac Page Factory
- Različite bilješke korištene u pristupu tvornici stranica
Prije nego što vidimo što je Pagefactory i kako se može koristiti zajedno s objektnim modelom Page, shvatimo što je to objektni model stranice koji je poznat kao POM.
=> Posjetite ovdje da biste vidjeli seriju treninga za selen za sve.
Što ćete naučiti:
- Što je objektni model stranice (POM)?
- Što je Pagefactory?
- POM pomoću tvornice stranica
- Često postavljana pitanja
- Zaključak
Što je objektni model stranice (POM)?
Teoretska terminologija opisuje Model objekta stranice kao obrazac dizajna koji se koristi za izgradnju spremišta objekata za web elemente dostupne u testiranoj aplikaciji. Rijetki drugi se pozivaju na njega kao na okvir za automatizaciju selena za datu testiranu aplikaciju.
Međutim, ono što sam razumio u vezi s pojmom Page Object Model je:
# 1) To je obrazac dizajna gdje imate zasebnu datoteku Java klase koja odgovara svakom zaslonu ili stranici u aplikaciji. Datoteka klase može sadržavati spremište objekata elemenata korisničkog sučelja, kao i metode.
#dva) U slučaju da na stranici postoje visoki web elementi, klasa spremišta objekata za stranicu može se odvojiti od klase koja uključuje metode za odgovarajuću stranicu.
Primjer: Ako stranica Registrirajte račun ima mnogo polja za unos, tada može postojati klasa RegisterAccountObjects.java koja oblikuje spremište objekata za elemente korisničkog sučelja na stranici računa računa.
Mogla bi se stvoriti zasebna datoteka klase RegisterAccount.java koja proširuje ili nasljeđuje RegisterAccountObjects koja uključuje sve metode koje izvode različite radnje na stranici.
# 3) Osim toga, ispod paketa može postojati generički paket s datotekom {roperties, Excel testnim podacima i uobičajenim metodama.
Primjer: DriverFactory koji se vrlo lako može koristiti na svim stranicama u aplikaciji
Razumijevanje POM-a na primjeru
Ček ovdje da biste saznali više o POM-u.
Ispod je snimak web stranice:
Klikom na svaku od ovih poveznica korisnik će se preusmjeriti na novu stranicu.
Evo snimke kako se gradi struktura projekta sa Selenijem koristeći objektni model Page koji odgovara svakoj stranici na web mjestu. Svaka Java klasa uključuje spremište objekata i metode za izvođenje različitih radnji unutar stranice.
Osim toga, postojat će još JUNIT ili TestNG ili datoteka klase Java koja poziva pozive na datoteke klasa ovih stranica.
Zašto koristimo objektni model stranice?
O aplikaciji ovog moćnog okvira Selenium nazvanog POM ili objektni model stranice postoji vijest. Sada se postavlja pitanje 'Zašto koristiti POM?'.
Jednostavan odgovor na to je da je POM kombinacija podatkovno vođenih, modularnih i hibridnih okvira. To je pristup sustavnoj organizaciji skripti na takav način da QA olakšava održavanje koda bez muke, a pomaže i u sprječavanju suvišnih ili dupliciranih koda.
Na primjer, ako dođe do promjene vrijednosti lokatora na određenoj stranici, tada je vrlo lako identificirati i izvršiti tu brzu promjenu samo u skripti odnosne stranice bez utjecaja na kod negdje drugdje.
Koncept Model objektnog modela stranice koristimo u programu Selenium Webdriver iz sljedećih razloga:
- U ovom POM modelu kreira se spremište objekata. Neovisan je od test slučajeva i može se ponovno koristiti za drugi projekt.
- Konvencija imenovanja metoda vrlo je jednostavna, razumljiva i realističnija.
- Pod objektnim modelom Page stvaramo klase stranica koje se mogu ponovno koristiti u drugom projektu.
- Model objekta Page jednostavan je za razvijeni okvir zbog svojih nekoliko prednosti.
- U ovom se modelu kreiraju zasebne klase za različite stranice web aplikacije kao što su stranica za prijavu, početna stranica, stranica s detaljima zaposlenika, stranica za promjenu lozinke itd.
- Ako postoji bilo kakva promjena u bilo kojem elementu web stranice, trebamo izvršiti promjene samo u jednom razredu, a ne u svim razredima.
- Dizajnirana skripta je višekratna, čitljiva i održiva u pristupu objektnom modelu stranice.
- Njegova je struktura projekta prilično laka i razumljiva.
- Može koristiti PageFactory u objektnom modelu stranice kako bi inicijalizirao web element i pohranio elemente u predmemoriju.
- TestNG se također može integrirati u pristup objektnom modelu stranice.
Primjena jednostavnog POM-a u selenu
# 1) Scenarij za automatizaciju
Sada automatiziramo zadani scenarij pomoću objektnog modela stranice.
Scenarij je objašnjen u nastavku:
Korak 1: Pokrenite web mjesto 'https: //demo.vtiger.com'.
Korak 2: Unesite valjanu vjerodajnicu.
Korak 3: Prijavite se na web mjesto.
Korak 4: Potvrdite početnu stranicu.
Korak 5: Odjavite se s web mjesta.
Korak 6: Zatvorite preglednik.
# 2) Selenijeve skripte za gornji scenarij u POM-u
Sada stvaramo POM strukturu u Eclipseu, kako je objašnjeno u nastavku:
Korak 1: Stvorite projekt u Eclipseu - Struktura temeljena na POM-u:
a) Izradite projekt „Model objekta stranice“.
b) Stvorite 3 paketa u okviru projekta.
- knjižnica
- stranice
- test slučajevi
Knjižnica: Ispod toga stavljamo one kodove koje treba pozivati iznova i iznova u našim testnim slučajevima, poput pokretanja preglednika, snimki zaslona itd. Korisnik pod njega može dodati više klasa ovisno o potrebama projekta.
Stranice: U skladu s tim, klase se kreiraju za svaku stranicu u web aplikaciji i mogu dodati više klasa stranica na temelju broja stranica u aplikaciji.
Test slučajevi: Ispod toga pišemo test slučaja za prijavu i možemo dodati više testnih slučajeva po potrebi za testiranje cijele aplikacije.
c) Predavanja ispod paketa prikazana su na donjoj slici.
Korak dva: Stvorite sljedeće pakete u paketu knjižnice.
Preglednik.java: U ovoj su klasi definirana 3 preglednika (Firefox, Chrome i Internet Explorer) koji se pozivaju u testnom slučaju prijave. Na temelju zahtjeva, korisnik može testirati aplikaciju i u različitim preglednicima.
package library; 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 Browser { static WebDriver driver; public static WebDriver StartBrowser(String browsername , String url) { // If the browser is Firefox if (browsername.equalsIgnoreCase('Firefox')) { // Set the path for geckodriver.exe System.setProperty('webdriver.firefox.marionette',' E://Selenium//Selenium_Jars//geckodriver.exe '); driver = new FirefoxDriver(); } // If the browser is Chrome else if (browsername.equalsIgnoreCase('Chrome')) { // Set the path for chromedriver.exe System.setProperty('webdriver.chrome.driver','E://Selenium//Selenium_Jars//chromedriver.exe'); driver = new ChromeDriver(); } // If the browser is IE else if (browsername.equalsIgnoreCase('IE')) { // Set the path for IEdriver.exe System.setProperty('webdriver.ie.driver','E://Selenium//Selenium_Jars//IEDriverServer.exe'); driver = new InternetExplorerDriver(); } driver.manage().window().maximize(); driver.get(url); return driver; } }
ScreenShot.java: U ovoj se klasi napiše program zaslona zaslona koji se poziva u testnom slučaju kada korisnik želi napraviti snimku zaslona da li test ne uspije ili prođe.
package library; import java.io.File; import org.apache.commons.io.FileUtils; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebDriver; public class ScreenShot { public static void captureScreenShot(WebDriver driver, String ScreenShotName) { try { File screenshot=((TakesScreenshot)driver).getScreenshotAs(OutputType. FILE ); FileUtils.copyFile(screenshot, new File('E://Selenium//'+ScreenShotName+'.jpg')); } catch (Exception e) { System. out .println(e.getMessage()); e.printStackTrace(); } } }
Korak 3: Stvorite klase stranica u paketu Page.
HomePage.java: Ovo je klasa početne stranice u kojoj su definirani svi elementi početne stranice i metode.
package pages; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class HomePage { WebDriver driver; By logout = By.id('p_lt_ctl03_wSOB_btnSignOutLink'); By home = By.id('p_lt_ctl02_wCU2_lblLabel'); //Constructor to initialize object public HomePage(WebDriver dr) { this .driver=dr; } public String pageverify() { return driver.findElement(home).getText(); } public void logout() { driver.findElement(logout).click(); } }
LoginPage.java: Ovo je klasa stranice za prijavu, u kojoj su definirani svi elementi stranice za prijavu i metode.
package pages; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class LoginPage { WebDriver driver; By UserID = By.xpath('//*(contains(@id,'Login1_UserName'))'); By password = By.xpath('//*(contains(@id,'Login1_Password'))'); By Submit = By.xpath('//*(contains(@id,'Login1_LoginButton'))'); //Constructor to initialize object public LoginPage(WebDriver driver) { this .driver = driver; } public void loginToSite(String Username, String Password) { this .enterUsername(Username); this .enterPasssword(Password); this .clickSubmit(); } public void enterUsername(String Username) { driver.findElement(UserID).sendKeys(Username); } public void enterPasssword(String Password) { driver.findElement(password).sendKeys(Password); } public void clickSubmit() { driver.findElement(Submit).click(); } }
Korak 4: Stvorite test slučajeve za scenarij prijave.
LoginTestCase.java: Ovo je klasa LoginTestCase, gdje se izvršava testni slučaj. Korisnik također može stvoriti više test slučajeva prema potrebama projekta.
package testcases; import java.util.concurrent.TimeUnit; import library.Browser; import library.ScreenShot; import org.openqa.selenium.WebDriver; import org.testng.Assert; import org.testng.ITestResult; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import pages.HomePage; import pages.LoginPage; public class LoginTestCase { WebDriver driver; LoginPage lp; HomePage hp; int i = 0; // Launch of the given browser. @BeforeTest public void browserlaunch() { driver = Browser.StartBrowser('Chrome', 'http://demostore.kenticolab.com/Special-Pages/Logon.aspx'); driver.manage().timeouts().implicitlyWait(30,TimeUnit. SECONDS ); lp = new LoginPage(driver); hp = new HomePage(driver); } // Login to the Site. @Test(priority = 1) public void Login() { lp.loginToSite('gaurav.3n@gmail.com','Test@123'); } // Verifing the Home Page. @Test(priority = 2) public void HomePageVerify() { String HomeText = hp.pageverify(); Assert.assertEquals(HomeText, 'Logged on as'); } // Logout the site. @Test(priority = 3) public void Logout() { hp.logout(); } // Taking Screen shot on test fail @AfterMethod public void screenshot(ITestResult result) { i = i+1; String name = 'ScreenShot'; String x = name+String.valueOf(i); if (ITestResult. FAILURE == result.getStatus()) { ScreenShot.captureScreenShot(driver, x); } } @AfterTest public void closeBrowser() { driver.close(); } }
Korak 5: Izvršite 'LoginTestCase.java'.
Korak 6: Izlaz objektnog modela stranice:
- Pokrenite preglednik Chrome.
- Demo web stranica otvorena je u pregledniku.
- Prijavite se na demo stranicu.
- Potvrdite početnu stranicu.
- Odjavite se s web mjesta.
- Zatvorite preglednik.
Sada, istražimo glavni koncept ovog vodiča koji plijeni pažnju, tj. “Pagefactory”.
Što je Pagefactory?
PageFactory je način primjene 'Model objekta stranice'. Ovdje slijedimo princip razdvajanja spremišta predmeta predmeta i metoda ispitivanja. To je ugrađeni koncept objektnog modela stranice koji je vrlo optimiziran.
Dajmo sada više jasnosti pojmu Pagefactory.
# 1) Prvo, koncept nazvan Pagefactory pruža alternativni način u smislu sintakse i semantike za stvaranje spremišta objekata za web elemente na stranici.
#dva) Drugo, koristi malo drugačiju strategiju za inicijalizaciju web elemenata.
# 3) Spremište objekata za web elemente korisničkog sučelja moglo bi se izraditi pomoću:
- Uobičajeni „POM bez Pagefactory“ i,
- Možete koristiti i 'POM s Pagefactory'.
Dolje je slikovni prikaz istog:
Sada ćemo razmotriti sve aspekte koji razlikuju uobičajeni POM od POM-a od Pagefactory-a.
a) Razlika u sintaksi lociranja elementa pomoću uobičajenog POM u odnosu na POM s Pagefactory.
Na primjer , Kliknite ovdje da biste pronašli polje za pretraživanje koje se prikazuje na stranici.
POM bez Pagefactory:
# 1) Ispod je pronalazak polja za pretraživanje pomoću uobičajenog POM-a:
WebElement searchNSETxt=driver.findElement(By.id(“searchBox”));
# 2) Sljedeći korak prenosi vrijednost 'ulaganje' u polje Search NSE.
searchNSETxt.sendkeys(“investment”);
POM koji koristi Pagefactory:
# 1) Polje za pretraživanje možete pronaći pomoću stranice Pagefactory kao što je prikazano dolje.
Bilješka @ Pronađi koristi se u Pagefactory za identificiranje elementa dok POM bez Pagefactory koristi driver.findElement () metoda za lociranje elementa.
Druga izjava za Pagefactory nakon @ Pronađi dodjeljuje tip tipa WebElement klasa koja radi točno slično dodjeli imena elementa tipa WebElement klasa kao povratni tip metode driver.findElement () koja se koristi u uobičajenom POM-u (u ovom primjeru tražiNSETxt).
Pogledat ćemo @ Pronađi pojedinosti u sljedećem dijelu ovog vodiča.
@FindBy(id = 'searchBox') WebElement searchNSETxt;
#dva) Sljedeći korak prenosi vrijednost 'ulaganje' u polje Search NSE, a sintaksa ostaje ista kao i u uobičajenom POM-u (POM bez Pagefactory-a).
searchNSETxt.sendkeys(“investment”);
b) Razlika u strategiji inicijalizacije web elemenata korištenjem uobičajenog POM u odnosu na POM s Pagefactory.
Korištenje POM-a bez Pagefactory:
Dolje je dat isječak koda za postavljanje putanje upravljačkog programa Chrome. Instalira se instanca WebDriver s imenom upravljačkog programa, a ChromeDriver se dodjeljuje 'upravljačkom programu'. Tada se isti objekt pokretača koristi za pokretanje web stranice Nacionalne burze, pronalaženje searchBox-a i unos vrijednosti niza u polje.
Poanta koju bih ovdje želio istaknuti je da se, kada je POM bez tvorničke stranice, instanca upravljačkog programa kreira u početku i svaki se web element svježe inicijalizira svaki put kada se taj web element poziva pomoću driver.findElement () ili upravljačkog programa .findElements ().
Zbog toga se s novim korakom driver.findElement () za element DOM struktura ponovno skenira i na toj se stranici vrši osvježena identifikacija elementa.
System.setProperty('webdriver.chrome.driver', 'C:\eclipse-workspace\automationframework\src\test\java\Drivers\chromedriver.exe'); WebDriver driver = new ChromeDriver(); driver.get('http://www.nseindia.com/'); WebElement searchNSETxt=driver.findElement(By.id(“searchBox”)); searchNSETxt.sendkeys(“investment”);
Korištenje POM-a s Pagefactory:
Osim korištenja bilješke @FindBy umjesto metode driver.findElement (), donji isječak koda koristi se dodatno za Pagefactory. Statička metoda initElements () klase PageFactory koristi se za inicijalizaciju svih UI elemenata na stranici čim se stranica učita.
public PagefactoryClass(WebDriver driver) { this.driver = driver; PageFactory.initElements(driver, this); }
Gornja strategija čini pristup PageFactory malo drugačijim od uobičajenog POM-a. U uobičajenom POM-u web element mora biti izričito inicijaliziran, dok se u pristupu Pagefactory svi elementi inicijaliziraju s initElements () bez izričite inicijalizacije svakog web elementa.
Na primjer: Ako je WebElement deklariran, ali nije inicijaliziran u uobičajenom POM-u, tada će se pojaviti pogreška 'inicijaliziraj varijablu' ili će se pojaviti NullPointerException. Stoga u uobičajenom POM-u svaki WebElement mora biti izričito inicijaliziran. PageFactory u ovom slučaju dolazi s prednošću u odnosu na uobičajeni POM.
Nemojmo inicijalizirati web element Datum datuma (POM bez Pagefactory), možete vidjeti da se prikazuje pogreška 'Initialize variable' i poziva korisnika da je inicijalizira na nulu, stoga ne možete pretpostaviti da se elementi implicitno inicijaliziraju kada ih lociraju.
Element BDate izričito inicijaliziran (POM bez Pagefactory):
Pogledajmo sada nekoliko slučajeva cjelovitog programa koji koristi PageFactory kako bismo isključili bilo kakvu dvosmislenost u razumijevanju aspekta implementacije.
Primjer 1:
- Idite na ‘http://www.nseindia.com/’
- S padajućeg izbornika pored polja za pretraživanje odaberite ‘Derivati valuta’.
- Potražite „USDINR“. Potvrdite tekst 'Američki dolar-indijska rupija - USDINR' na rezultirajućoj stranici.
Struktura programa:
- Stvara se PagefactoryClass.java koja uključuje spremište objekata pomoću koncepta tvornice stranica za nseindia.com koji je konstruktor za inicijalizaciju svih web elemenata, metoda selectCurrentDerivative () za odabir vrijednosti iz padajućeg polja okvira za pretraživanje, selectSymbol () za odabir simbola na stranica koja se prikazuje sljedeća i verifytext () da provjeri je li zaglavlje stranice onakvo kakvo se očekuje.
- NSE_MainClass.java je datoteka glavne klase koja poziva sve gore navedene metode i izvodi odgovarajuće radnje na NSE mjestu.
PagefactoryClass.java
package com.pagefactory.knowledge; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; import org.openqa.selenium.support.ui.Select; public class PagefactoryClass { WebDriver driver; @FindBy(id = 'QuoteSearch') WebElement Searchbox; @FindBy(id = 'cidkeyword') WebElement Symbol; @FindBy(id = 'companyName') WebElement pageText; public PagefactoryClass(WebDriver driver) { this.driver = driver; PageFactory.initElements(driver, this); } public void selectCurrentDerivative(String derivative) { Select select = new Select(Searchbox); select.selectByVisibleText(derivative); // 'Currency Derivatives' } public void selectSymbol(String symbol) { Symbol.sendKeys(symbol); } public void verifytext() { if (pageText.getText().equalsIgnoreCase('U S Dollar-Indian Rupee - USDINR')) { System.out.println('Page Header is as expected'); } else System.out.println('Page Header is NOT as expected'); } }
NSE_MainClass.java
package com.pagefactory.knowledge; import java.util.List; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.StaleElementReferenceException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class NSE_MainClass { static PagefactoryClass page; static WebDriver driver; public static void main(String() args) { System.setProperty('webdriver.chrome.driver', 'C:\Users\eclipse-workspace\automation-framework\src\test\java\Drivers\chromedriver.exe'); driver = new ChromeDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get('https://www.nseindia.com/'); driver.manage().window().maximize(); test_Home_Page_ofNSE(); } public static void test_Home_Page_ofNSE() throws StaleElementReferenceException { page = new PagefactoryClass(driver); page.selectCurrentDerivative('Currency Derivatives'); page.selectSymbol('USD'); List Options = driver.findElements(By.xpath('//span(contains(.,'USD'))')); int count = Options.size(); for (int i = 0; i Primjer 2:
- Idite na ‘https://www.shoppersstop.com/brands’
- Idite na vezu Haute curry.
- Provjerite sadrži li stranica Haute Curry tekst 'Pokreni nešto novo'.
Struktura programa
- stvara se shopperstopPagefactory.java koja uključuje spremište objekata pomoću koncepta pagefactory za shoppersstop.com koji je konstruktor za inicijalizaciju svih web elemenata, metode closeExtraPopup () za rukovanje iskačućim okvirom upozorenja koji se otvara, clickOnHauteCurryLink () da kliknete na Haute Curry Povežite i verifyStartNewSomething () kako biste provjerili sadrži li stranica Haute Curry tekst 'Pokreni nešto novo'.
- Shopperstop_CallPagefactory.java je glavna datoteka klase koja poziva sve gore navedene metode i izvodi odgovarajuće radnje na NSE mjestu.
shopperstopPagefactory.java
package com.inportia.automation_framework; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class shopperstopPagefactory { WebDriver driver; @FindBy(id='firstVisit') WebElement extrapopup; @FindBy(xpath='//img(@src='https://sslimages.shoppersstop.com /sys-master/root/haf/h3a/9519787376670/brandMedia_HauteCurry_logo.png')') WebElement HCLink; @FindBy(xpath='/html/body/main/footer/div(1)/p') WebElement Startnew; public shopperstopPagefactory(WebDriver driver) { this.driver=driver; PageFactory.initElements(driver, this); } public void closeExtraPopup() { extrapopup.click(); } public void clickOnHauteCurryLink() { JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript('arguments(0).click();',HCLink); js.executeAsyncScript('window.setTimeout(arguments(arguments.length - 1), 10000);'); if(driver.getCurrentUrl().equals('https://www.shoppersstop.com/haute-curry')) { System.out.println('We are on the Haute Curry page'); } else { System.out.println('We are NOT on the Haute Curry page'); } } public void verifyStartNewSomething() { if (Startnew.getText().equalsIgnoreCase('Start Something New')) { System.out.println('Start new something text exists'); } else System.out.println('Start new something text DOESNOT exists'); } }
Shopperstop_CallPagefactory.java
package com.inportia.automation_framework; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class Shopperstop_CallPagefactory extends shopperstopPagefactory { public Shopperstop_CallPagefactory(WebDriver driver) { super(driver); // TODO Auto-generated constructor stub } static WebDriver driver; public static void main(String() args) { System.setProperty('webdriver.chrome.driver', 'C:\eclipse-workspace\automation-framework\src\test\java\Drivers\chromedriver.exe'); driver = new ChromeDriver(); Shopperstop_CallPagefactory s1=new Shopperstop_CallPagefactory(driver); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get('https://www.shoppersstop.com/brands'); s1.clickOnHauteCurryLink(); s1.verifyStartNewSomething(); } }
POM pomoću tvornice stranica
Video vodiči - POM s tvornicom stranica
I dio
II dio
Klasa Factory koristi se za jednostavnije i jednostavnije korištenje Page Objects.
- Prvo, web-elemente moramo pronaći anotacijom @ Pronađi na satovima stranica .
- Zatim inicijalizirajte elemente pomoću initElements () prilikom instanciranja klase stranice.
# 1) @ Pronađi:
Bilješka @FindBy koristi se u PageFactoryu za pronalaženje i deklariranje web elemenata pomoću različitih lokatora.Ovdje atribut, kao i njegovu vrijednost koja se koristi za lociranje web elementa, prosljeđujemo u napomenu @FindBy i tada se proglašava WebElement.
Postoje dva načina na koje se napomena može koristiti.
Na primjer:
@FindBy(how = How.ID, using='EmailAddress') WebElement Email; @FindBy(id='EmailAddress') WebElement Email;
Međutim, prvi je standardni način deklariranja WebElements.
'Kako' je klasa i ima statičke varijable poput ID, XPATH, CLASSNAME, LINKTEXT itd.
'Koristeći' - Za dodjeljivanje vrijednosti statičkoj varijabli.
U navedenom primjer , koristili smo atribut 'id' za pronalaženje web elementa 'Email'. Slično tome, možemo upotrijebiti sljedeće lokatore s oznakama @FindBy:
- className
- css
- Ime
- xpath
- tagName
- linkText
- djelomičniLinkText
# 2) initElements ():
InitElements je statična metoda klase PageFactory koja se koristi za inicijalizaciju svih web elemenata koji se nalaze u bilješci @FindBy. Dakle, lako instanciranje klasa Page.
initElements(WebDriver driver, java.lang.Class pageObjectClass)
Također bismo trebali razumjeti da POM slijedi OOPS principe.
- WebElements su deklarirani kao varijable privatnih članova (Data Hiding).
- Povezivanje WebElemenata s odgovarajućim metodama (enkapsulacija).
Koraci za stvaranje POM-a pomoću uzoraka stranice Factory
# 1) Stvorite zasebnu datoteku Java klase za svaku web stranicu.
#dva) U svakoj klasi svi WebElements trebaju biti deklarirani kao varijable (pomoću bilješke - @FindBy) i inicijalizirani metodom initElement (). Proglašeni WebElements moraju se inicijalizirati da bi se koristili u akcijskim metodama.
# 3) Definirajte odgovarajuće metode koje djeluju na te varijable.
Uzmimo primjer jednostavnog scenarija:
- Otvorite URL aplikacije.
- Upišite podatke e-adrese i lozinke.
- Kliknite gumb Prijava.
- Provjerite uspješnu poruku za prijavu na stranici za pretraživanje.
Sloj stranice
Ovdje imamo 2 stranice,
- Početna stranica - Stranica koja se otvara kada se unese URL i na koju unosimo podatke za prijavu.
- SearchPage - Stranica koja se prikazuje nakon uspješne prijave.
U sloju stranice, svaka stranica u web aplikaciji deklarirana je kao zasebna Java klasa i tamo su spomenuti njezini lokatori i radnje.
Koraci za stvaranje POM-a na primjeru u stvarnom vremenu
# 1) Stvorite Java klasu za svaku stranicu:
U ovome primjer , pristupit ćemo 2 web stranice, 'Početna' i 'Pretraživačka' stranica.
Stoga ćemo stvoriti 2 Java klase u Page Layer (ili u paketu recimo com.automation.pages).
Package Name :com.automation.pages HomePage.java SearchPage.java
# 2) Definirajte WebElements kao varijable pomoću Annotation @FindBy:
Surađivali bismo sa:
- E-pošta, lozinka, polje gumba za prijavu na početnoj stranici.
- Uspješna poruka na stranici za pretraživanje.
Stoga ćemo definirati WebElements pomoću @FindBy
Na primjer: Ako ćemo identificirati EmailAddress pomoću atributa id, tada je njegova deklaracija varijable
//Locator for EmailId field @FindBy(how=How.ID,using='EmailId') private WebElementEmailIdAddress;
# 3) Stvorite metode za radnje izvršene na WebElements.
Ispod se izvršavaju radnje na WebElements:
- Upišite radnju u polje Adresa e-pošte.
- Upišite radnju u polje Lozinka.
- Kliknite akciju na gumbu za prijavu.
Na primjer, Korisnički definirane metode kreiraju se za svaku radnju na WebElementu kao,
public void typeEmailId(String Id){ driver.findElement(EmailAddress).sendKeys(Id) }
Ovdje se Id prenosi kao parametar u metodi, jer će korisnik poslati unos iz glavnog test slučaja.
Bilješka :Konstruktor se mora stvoriti u svakoj klasi u sloju stranice, kako bi se instanca upravljačkog programa dobila iz glavne klase u testnom sloju i kako bi se inicijalizirali WebElements (objekti stranice) deklarirani u klasi stranice pomoću stranice PageFactory.InitElement () .
Ovdje ne pokrećemo pokretački program, već se njegova instanca dobiva iz glavne klase kada se kreira objekt klase Page Layer.
InitElement () - koristi se za inicijalizaciju deklariranih WebElemenata, pomoću instance upravljačkog programa iz glavne klase. Drugim riječima, WebElements se izrađuju pomoću instance upravljačkog programa. Tek nakon što se WebElements inicijalizira, oni se mogu koristiti u metodama za izvođenje radnji.
Dvije Java klase kreiraju se za svaku stranicu kako je prikazano u nastavku:
HomePage.java
//package com.automation.pages; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class HomePage { WebDriver driver; // Locator for Email Address @FindBy(how=How.ID,using='EmailId') private WebElement EmailIdAddress; // Locator for Password field @FindBy(how=How.ID,using='Password ') private WebElement Password; // Locator for SignIn Button @FindBy(how=How.ID,using='SignInButton') private WebElement SignInButton; // Method to type EmailId public void typeEmailId(String Id){ driver.findElement(EmailAddress).sendKeys(Id) } // Method to type Password public void typePassword(String PasswordValue){ driver.findElement(Password).sendKeys(PasswordValue) } // Method to click SignIn Button public void clickSignIn(){ driver.findElement(SignInButton).click() } // Constructor // Gets called when object of this page is created in MainClass.java public HomePage(WebDriver driver) { // 'this' keyword is used here to distinguish global and local variable 'driver' //gets driver as parameter from MainClass.java and assigns to the driver instance in this class this.driver=driver; PageFactory.initElements(driver,this); // Initialises WebElements declared in this class using driver instance. } }
SearchPage.Java
//package com.automation.pages; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class SearchPage{ WebDriver driver; // Locator for Success Message @FindBy(how=How.ID,using='Message') private WebElement SuccessMessage; // Method that return True or False depending on whether the message is displayed public Boolean MessageDisplayed(){ Boolean status = driver.findElement(SuccessMessage).isDisplayed(); return status; } // Constructor // This constructor is invoked when object of this page is created in MainClass.java public SearchPage(WebDriver driver) { // 'this' keyword is used here to distinguish global and local variable 'driver' //gets driver as parameter from MainClass.java and assigns to the driver instance in this class this.driver=driver; PageFactory.initElements(driver,this); // Initialises WebElements declared in this class using driver instance. } }
Testni sloj
U ovoj se klasi provode test slučajevi. Izrađujemo zasebni paket recimo com.automation.test, a zatim ovdje stvaramo Java Class (MainClass.java)
Koraci za stvaranje test slučajeva:
- Inicijalizirajte upravljački program i otvorite aplikaciju.
- Stvorite objekt klase PageLayer (za svaku web stranicu) i proslijedite instancu upravljačkog programa kao parametar.
- Koristeći stvoreni objekt, uputite poziv metodama iz klase PageLayer (za svaku web stranicu) kako biste izvršili radnje / provjeru.
- Ponavljajte korak 3 dok se ne izvrše sve radnje, a zatim zatvorite upravljački program.
//package com.automation.test; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class MainClass { public static void main(String() args) { System.setProperty('webdriver.chrome.driver','./exefiles/chromedriver.exe'); WebDriver driver= new ChromeDriver(); driver.manage().window().maximize(); driver.get('URL mentioned here'); // Creating object of HomePage and driver instance is passed as parameter to constructor of Homepage.Java HomePage homePage= new HomePage(driver); // Type EmailAddress homePage.typeEmailId('abc@ymail.com'); // EmailId value is passed as paramter which in turn will be assigned to the method in HomePage.Java // Type Password Value homePage.typePassword('password123'); // Password value is passed as paramter which in turn will be assigned to the method in HomePage.Java // Click on SignIn Button homePage.clickSignIn(); // Creating an object of LoginPage and driver instance is passed as parameter to constructor of SearchPage.Java SearchPage searchPage= new SearchPage(driver); //Verify that Success Message is displayed Assert.assertTrue(searchPage.MessageDisplayed()); //Quit browser driver.quit(); } }
Hijerarhija tipa bilješke koja se koristi za deklariranje web elemenata
Bilješke se koriste za izradu strategije lokacije za elemente korisničkog sučelja.
# 1) @ Pronađi
Kada je u pitanju Pagefactory, @FindBy djeluje kao čarobni štapić. Dodaje svu snagu konceptu. Sad ste svjesni da oznaka @FindBy u Pagefactoryu izvodi isto što i oznaka driver.findElement () u uobičajenom objektnom modelu stranice. Koristi se za lociranje WebElementa / WebElementa s jednim kriterijem .
# 2) @FindBys
Koristi se za pronalaženje WebElementa sa više kriterija i moraju odgovarati svim zadanim kriterijima. Te bi kriterije trebalo spomenuti u odnosu roditelj-dijete. Drugim riječima, ovo koristi uvjetni odnos AND za lociranje WebElemenata pomoću navedenih kriterija. Koristi višestruki @FindBy za definiranje svakog kriterija.
Na primjer:
HTML izvorni kod WebElementa:
U POM-u:
@FindBys({ @FindBy(id = 'searchId_1'), @FindBy(name = 'search_field') }) WebElementSearchButton;
U gornjem primjeru WebElement ‘SearchButton’ nalazi se samo ako jest odgovara oboje kriteriji čija je vrijednost id 'searchId_1', a vrijednost imena 'search_field'. Napominjemo da prvi kriterij pripada nadređenoj oznaci, a drugi kriterij za podređenu oznaku.
# 3) @ Pronađi sve
Koristi se za pronalaženje WebElementa sa više kriterija i mora odgovarati barem jednom od zadanih kriterija. Ovdje se koriste ILI uvjetni odnosi da bi se pronašli WebElements. Koristi višestruki @FindBy za definiranje svih kriterija.
Na primjer:
HTML izvorni kod:
U POM-u:
@FindBys({ @FindBy(id = 'UsernameNameField_1'), // doesn’t match @FindBy(name = 'User_Id') //matches @FindBy(className = “UserName_r”) //matches }) WebElementUserName;
U gornjem primjeru nalazi se WebElement ‘Korisničko ime ako se nalazi odgovara barem jednom navedenih kriterija.
# 4) @CacheLookUp
Kada se WebElement češće koristi u testnim slučajevima, Selenium traži WebElement svaki put kada se pokrene testna skripta. U onim slučajevima, u kojima se određeni WebElements globalno koriste za sve TC ( Na primjer, Scenarij prijave događa se za svaki TC), ova se napomena može koristiti za održavanje tih WebElemenata u predmemoriji nakon što se pročita prvi put.
To, pak, pomaže kodu da se brže izvršava, jer svaki put kada ne mora tražiti WebElement na stranici, nego referencu može dobiti iz memorije.
To može biti prefiks bilo kojem od @FindBy, @FindBys i @FindAll.
Na primjer:
@CacheLookUp @FindBys({ @FindBy(id = 'UsernameNameField_1'), @FindBy(name = 'User_Id') @FindBy(className = “UserName_r”) }) WebElementUserName;
Također imajte na umu da bi se ova napomena trebala koristiti samo za WebElements čija se vrijednost atributa (poput xpath, ime id, naziv klase itd.) Ne mijenja često. Kada se WebElement prvi put pronađe, on zadržava svoju referencu u predmemoriji.
Dakle, onda se dogodi promjena atributa WebElementa nakon nekoliko dana, Selenium neće moći pronaći element, jer već ima svoju staru referencu u svojoj predmemoriji i neće uzeti u obzir nedavnu promjenu u WebElementu.
Više na PageFactory.initElements ()
Sad kad razumijemo strategiju Pagefactory-a za inicijalizaciju web-elemenata pomoću InitElements (), pokušajmo razumjeti različite verzije metode.
Metoda kao što znamo uzima objekt pogona i objekt trenutne klase kao ulazne parametre i vraća objekt stranice implicitnom i proaktivnom inicijalizacijom svih elemenata na stranici.
U praksi je upotreba konstruktora, kao što je prikazano u gornjem odjeljku, poželjnija od ostalih načina njegove uporabe.
Alternativni načini pozivanja metode su:
# 1) Umjesto korištenja pokazivača 'this', možete stvoriti trenutni objekt klase, proslijediti mu instancu upravljačkog programa i pozvati statičku metodu initElements s parametrima, tj. Objekt vozača i objekt klase koji je upravo stvoren.
public PagefactoryClass(WebDriver driver) { //version 2 PagefactoryClass page=new PagefactoryClass(driver); PageFactory.initElements(driver, page); }
#dva) Treći način inicijalizacije elemenata pomoću klase Pagefactory jest korištenje api naziva 'odraz'. Da, umjesto stvaranja objekta klase s ključnom riječi „new“, classname.class može se proslijediti kao dio ulaznog parametra initElements ().
public PagefactoryClass(WebDriver driver) { //version 3 PagefactoryClass page=PageFactory.initElements(driver, PagefactoryClass.class); }
Često postavljana pitanja
P # 1) Koje su različite strategije lociranja koje se koriste za @FindBy?
Odgovor: Jednostavan odgovor na to je da ne postoje različite strategije lociranja koje se koriste za @FindBy.
Koriste istih 8 strategija lociranja koje metoda findElement () u uobičajenom POM-u koristi:
- iskaznica
- Ime
- className
- xpath
- css
- tagName
- linkText
- djelomičniLinkText
P # 2) Postoje li različite verzije od upotrebe i napomena @FindBy?
Odgovor: Kada postoji web element koji treba pretražiti, koristimo napomenu @FindBy. Razradit ćemo alternativne načine korištenja @FindBy zajedno s različitim strategijama lociranja.
Već smo vidjeli kako koristiti verziju 1 @FindBy:
@FindBy(id = 'cidkeyword') WebElement Symbol;
Verzija 2 @FindBy je prosljeđivanjem ulaznog parametra kao Kako i Koristeći .
Kako traži strategiju lokatora pomoću koje bi se identificirao webelement. Ključna riječ koristeći definira vrijednost lokatora.
Pogledajte dolje za bolje razumijevanje,
- How.ID pretražuje element pomoću iskaznica strategija i element koji pokušava identificirati ima id = cidkeyword.
@FindBy(how = How.ID, using = ' cidkeyword') WebElement Symbol;
- How.CLASS_NAME pretražuje element pomoću className strategija i element koji pokušava identificirati ima class = newclass.
@FindBy(how = How.CLASS_NAME, using = 'newclass') WebElement Symbol;
P # 3) Postoji li razlika između dvije verzije @FindBy?
Odgovor: Odgovor je Ne, nema razlike između dvije verzije. Samo je prva verzija kraća i lakša u usporedbi s drugom verzijom.
P # 4) Što koristim u tvornici stranica u slučaju da postoji popis web elemenata koji se trebaju nalaziti?
Odgovor: U uobičajenom uzorku dizajna objekta stranice imamo driver.findElements () za lociranje više elemenata koji pripadaju istoj klasi ili imenu oznake, ali kako locirati takve elemente u slučaju objektnog modela stranice s Pagefactory? Najlakši način za postizanje takvih elemenata je korištenje iste napomene @FindBy.
Razumijem da se čini da je ova linija mnogima od vas ogrebotina po glavi. Ali da, to je odgovor na pitanje.
Pogledajmo donji primjer:
Koristeći uobičajeni objektni model stranice bez Pagefactory-a, koristite driver.findElements za lociranje više elemenata kao što je prikazano u nastavku:
private List multipleelements_driver_findelements = driver.findElements (By.class(“last”));
Isto se može postići korištenjem objektnog modela stranice s Pagefactory-om kako je dano dolje:
@FindBy (how = How.CLASS_NAME, using = 'last') private List multipleelements_FindBy;
U osnovi, dodjeljivanje elemenata popisu tipa WebElement čini trik bez obzira koristi li se Pagefactory tijekom identificiranja i lociranja elemenata.
P # 5) Može li se i objektni dizajn stranice bez Pagefactory i sa Pagefactory koristiti u istom programu?
Odgovor: Da, i dizajn objekta stranice bez Pagefactory i s Pagefactory mogu se koristiti u istom programu. Možete proći kroz program dolje naveden u Odgovor na pitanje br. 6 kako bi vidjeli kako se oboje koriste u programu.
Jedna stvar koju treba imati na umu jest da treba izbjegavati koncept Pagefactory s predmemoriranom značajkom na dinamičkim elementima, dok dizajn objekta stranice dobro funkcionira za dinamičke elemente. Međutim, Pagefactory odgovara samo statičkim elementima.
P # 6) Postoje li alternativni načini identificiranja elemenata na temelju više kriterija?
kako pronaći sigurnosni ključ usmjerivača
Odgovor: Alternativa za prepoznavanje elemenata na temelju više kriterija je upotreba napomena @FindAll i @FindBys. Te bilješke pomažu identificirati pojedinačne ili višestruke elemente ovisno o vrijednostima dohvaćenim u kriterijima koji su u njemu proslijeđeni.
# 1) @ Pronađi sve:
@FindAll može sadržavati višestruke @FindBy i vratit će sve elemente koji se podudaraju s bilo kojim @FindBy na jednom popisu. @FindAll koristi se za označavanje polja na objektu stranice kako bi naznačio da bi traženje trebalo koristiti niz oznaka @FindBy. Zatim će potražiti sve elemente koji odgovaraju bilo kojem od kriterija FindBy.
Imajte na umu da elementi ne moraju biti u redoslijedu dokumenata.
Sintaksa za upotrebu @FindAll je kao u nastavku:
@FindAll( { @FindBy(how = How.ID, using = 'foo'), @FindBy(className = 'bar') } )
Obrazloženje: @FindAll će pretražiti i identificirati zasebne elemente koji odgovaraju svakom od kriterija @FindBy i navesti ih. U gornjem primjeru prvo će pretražiti element čiji je id = ”foo”, a zatim će identificirati drugi element s className = ”bar”.
Pod pretpostavkom da je za svaki kriterij FindBy identificiran jedan element, @FindAll će rezultirati navođenjem 2 elementa. Zapamtite, za svaki kriterij može biti identificirano više elemenata. Tako je jednostavnim riječima @ Pronađi sve djeluje ekvivalentno ILI operator na prosljeđenim kriterijima @FindBy.
# 2) @FindBys:
FindBys se koristi za označavanje polja na objektu stranice kako bi naznačio da bi traženje trebalo koristiti niz oznaka @FindBy u lancu kako je opisano u ByChained. Kada potrebni WebElement objekti moraju odgovarati svim zadanim kriterijima, upotrijebite bilješku @FindBys.
Sintaksa za upotrebu @FindBys je kao u nastavku:
@FindBys( { @FindBy(name=”foo”) @FindBy(className = 'bar') } )
Obrazloženje: @FindBys će pretražiti i identificirati elemente koji odgovaraju svim kriterijima @FindBy i navesti ih. U gornjem primjeru tražit će elemente čije je ime = 'foo' i className = 'bar'.
@FindAll rezultirat će navođenjem 1 elementa ako pretpostavimo da je jedan element identificiran s imenom i imenom klase u zadanim kriterijima.
Ako niti jedan element ne zadovoljava sve položene uvjete FindBy, tada će rezultanta @FindBys biti nula elemenata. Mogao bi se utvrditi popis web elemenata ako svi uvjeti zadovoljavaju više elemenata. Jednostavnim riječima, @ FindBys djeluje ekvivalentno I operator na prosljeđenim kriterijima @FindBy.
Pogledajmo provedbu svih gore navedenih bilješki kroz detaljan program:
Izmijenit ćemo program www.nseindia.com naveden u prethodnom odjeljku kako bismo razumjeli implementaciju napomena @FindBy, @FindBys i @FindAll
# 1) Spremište objekata PagefactoryClass ažurira se na sljedeći način:
Popis newlist = driver.findElements (By.tagName (“a”));
@ Pronađi (kako = Kako. TAG_NAME , koristeći = 'a')
privatna Popis findbyvalue;
@ Pronađi sve ({ @ Pronađi (ime klase = “sel”), @ Pronađi (xpath = ”// a (@ id =’ tab5 ′) ”)}))
privatna Popis findallvalue;
@FindBys ({ @ Pronađi (ime klase = “sel”), @ Pronađi (xpath = ”// a (@ id =’ tab5 ′) ”)}))
privatna Popis findbysvalue;
# 2) Nova metoda seeHowFindWorks () napisana je u PagefactoryClass i poziva se kao posljednja metoda u glavnoj klasi.
Metoda je kao u nastavku:
private void seeHowFindWorks() { System.out.println('driver.findElements(By.tagName()) '+newlist.size()); System.out.println('count of @FindBy- list elements '+findbyvalue.size()); System.out.println('count of @FindAll elements '+findallvalue.size()); for(int i=0;i Dolje je dan rezultat prikazan na prozoru konzole nakon izvršenja programa:

Pokušajmo sada detaljno razumjeti kod:
# 1) Kroz obrazac dizajna objekta stranice, element ‘newlist’ identificira sve oznake sidrom ‘a’. Drugim riječima, dobit ćemo broj svih veza na stranici.
Saznali smo da pagefactory @FindBy radi isti posao kao i driver.findElement (). Element findbyvalue stvoren je za dobivanje broja svih poveznica na stranici kroz strategiju pretraživanja koja ima koncept tvornice stranica.
Dokazuje se točnim da i driver.findElement () i @FindBy rade isti posao i identificiraju iste elemente. Ako pogledate snimku zaslona rezultirajućeg prozora konzole gore, broj veza identificiranih s elementom newlist i broja findbyvalue jednak je tj. 299 veze pronađene na stranici.
Rezultat je prikazan kao dolje:
driver.findElements(By.tagName()) 299 count of @FindBy- list elements 299
#dva) Ovdje razrađujemo rad anotacije @FindAll koja će se odnositi na popis web elemenata s imenom findallvalue.
Pažljivo gledajući svaki kriterij @FindBy u bilješci @FindAll, prvi kriterij @FindBy traži elemente s className = 'sel', a drugi kriterij @FindBy traži određeni element s XPath = “// a (@ id = 'tab5')
Pritisnite sada F12 da pregledamo elemente na stranici nseindia.com i dobijemo određene jasnoće na elementima koji odgovaraju kriterijima @FindBy.
Na stranici postoje dva elementa koja odgovaraju className = ”sel”:
do) Element 'Osnove' ima oznaku popisa tj.
s className = ”sel”. Pogledajte Snimku ispod

b) Drugi element 'Knjiga narudžbi' ima XPath s sidrenom oznakom koja ima naziv klase kao 'sel'.

c) Drugi @FindBy s XPathom ima sidrenu oznaku čiji iskaznica je ' tab5 '. Kao odgovor na pretragu identificiran je samo jedan element koji je Osnove.
Pogledajte Snimak ispod:

Kada je izveden test nseindia.com, dobili smo broj elemenata po kojima je pretražen.
@FindAll as 3. Elementi za findallvalue kada su prikazani bili su: Osnove kao 0thindeksni element, Knjiga narudžbi kao 1svelement indeksa i Osnove opet kao 2ndelement indeksa. Već smo saznali da @FindAll identificira elemente za svaki kriterij @FindBy zasebno.
Po istom protokolu, za pretragu prvog kriterija, tj. ClassName = 'sel', identificirao je dva elementa koja zadovoljavaju uvjet i dohvatio je 'Osnove' i 'Knjigu narudžbi'.
Zatim se premjestio na sljedeći kriterij @FindBy i po xpatu zadanom za drugi @FindBy mogao je dohvatiti element 'Osnove'. Zbog toga je konačno identificirao 3 elementa.
Dakle, ne dobiva elemente koji zadovoljavaju niti jedan od @FindBy uvjeta, već se odvojeno bavi svakim od @FindBy i identificira elemente na isti način. Uz to, u trenutnom smo primjeru također vidjeli da ne gleda jesu li elementi jedinstveni ( Npr. Element 'Osnove' u ovom slučaju koji je prikazan dva puta kao dio rezultata dva kriterija @FindBy)
# 3) Ovdje razrađujemo rad bilješke @FindBys koja će se odnositi na popis web elemenata s imenom findbysvalue. I ovdje prvi @FindBy kriterij traži elemente s className = ’sel’, a drugi @FindBy kriterij traži određeni element s xpath = “// a (@ id =” tab5 ”).
Sad kad znamo, elementi identificirani za prvi uvjet @FindBy su 'Osnove' i 'Knjiga narudžbi', a drugi kriterij @FindBy je 'Osnove'.
Pa, kako će rezultat @FindBys biti drugačiji od @FindAll? U prethodnom smo odjeljku saznali da je @FindBys ekvivalentan uvjetnom operatoru AND i stoga traži element ili popis elemenata koji zadovoljavaju sve uvjete @FindBy.
Prema našem trenutnom primjeru, vrijednost 'Osnove' jedini je element koji ima class = 'sel' i id = 'tab5', čime zadovoljava oba uvjeta. Zbog toga je veličina @FindBys u test caseu 1 i prikazuje vrijednost kao 'Osnove'.
Keširanje elemenata u Pagefactory
Svaki put kad se stranica učita, svi elementi na stranici se ponovno traže pozivanjem poziva putem @FindBy ili driver.findElement () i novo je traženje elemenata na stranici.
Većinu vremena kada su elementi dinamični ili se mijenjaju tijekom izvođenja, pogotovo ako su to AJAX elementi, zasigurno ima smisla da sa svakim učitavanjem stranice postoji nova pretraga svih elemenata na stranici.
Kada web stranica ima statičke elemente, predmemoriranje elementa može pomoći na više načina. Kada su elementi predmemorirani, ne mora ponovno locirati elemente prilikom učitavanja stranice, već se može uputiti na spremište predmemoriranih elemenata. To štedi puno vremena i podiže bolje performanse.
Pagefactory pruža ovu značajku predmemoriranja elemenata pomoću bilješke @CacheLookUp .
Bilješka govori vozaču da koristi istu instancu lokatora iz DOM-a za elemente i da ih više ne pretražuje dok metoda initElements pagefactory-a vidljivo doprinosi spremanju predmemoriranog statičkog elementa. InitElements rade predmemoriranje elemenata.
To čini koncept pagefactory-a posebnim u odnosu na uobičajeni obrazac dizajna predmeta stranice. Dolazi sa svojim vlastitim prednostima i nedostacima o kojima ćemo razgovarati malo kasnije. Na primjer, gumb za prijavu na Facebook početnoj stranici je statični element koji se može predmemorirati i idealan je element za predmemoriranje.
Pogledajmo sada kako implementirati napomenu @CacheLookUp
Prvo ćete morati uvesti paket za Cachelookup kao što je prikazano u nastavku:
import org.openqa.selenium.support.CacheLookup
Ispod je isječak koji prikazuje definiciju elementa pomoću @CacheLookUp. Čim se UniqueElement pretražuje prvi put, initElement () sprema predmemoriranu verziju elementa tako da se sljedeći put upravljački program ne traži element umjesto da se odnosi na istu predmemoriju i izvodi akciju s desne strane elementa daleko.
@FindBy(id = 'unique') @CacheLookup private WebElement UniqueElement;
Pogledajmo sada kroz stvarni program kako su akcije na predmemoriranom web elementu brže od onih na predmemoriranom web elementu:
Dalje unapređujući program nseindia.com napisao sam još jednu novu metodu monitorPerformance () u kojoj izrađujem predmemorirani element za okvir za pretraživanje i ne-predmemorirani element za isti okvir za pretraživanje.
Tada pokušavam dobiti naziv oznake elementa 3000 puta i za predmemorirani i za ne-predmemorirani element i pokušavam izmjeriti vrijeme potrebno za izvršavanje zadatka i predmemoriranim i ne-predmemoriranim elementom.
Razmotrio sam 3000 puta kako bismo mogli vidjeti vidljivu razliku u vremenima za to dvoje. Očekivat ću da bi predmemorirani element trebao dovršiti dobivanje naziva oznake 3000 puta za manje vremena u usporedbi s ne-predmemoriranim elementom.
Sada znamo zašto bi predmemorirani element trebao raditi brže, tj. Vozaču je naloženo da ne traži element nakon prvog pretraživanja, već izravno nastavlja raditi na njemu, a to nije slučaj s ne-predmemoriranim elementom za koji se vrši traženje elementa svih 3000 puta i tada se na njemu izvodi radnja.
Ispod je kôd metode monitorPerformance ():
private void monitorPerformance() { //non cached element long NoCache_StartTime = System.currentTimeMillis(); for(int i = 0; i <3000; i ++) { Searchbox.getTagName(); } long NoCache_EndTime = System.currentTimeMillis(); long NoCache_TotalTime=(NoCache_EndTime-NoCache_StartTime)/1000; System.out.println('Response time without caching Searchbox ' + NoCache_TotalTime+ ' seconds'); //cached element long Cached_StartTime = System.currentTimeMillis(); for(int i = 0; i < 3000; i ++) { cachedSearchbox.getTagName(); } long Cached_EndTime = System.currentTimeMillis(); long Cached_TotalTime=(Cached_EndTime - Cached_StartTime)/1000; System.out.println('Response time by caching Searchbox ' + Cached_TotalTime+ ' seconds'); }
Po izvršenju vidjet ćemo donji rezultat u prozoru konzole:
Kao rezultat, zadatak na nekamiranom elementu je dovršen u 82 sekundi dok je vrijeme potrebno za izvršavanje zadatka na predmemoriranom elementu bilo samo 37 sekunde. To je doista vidljiva razlika u vremenu odziva i predmemoriranog i ne-predmemoriranog elementa.

P # 7) Koje su prednosti i nedostaci napomene @CacheLookUp u konceptu Pagefactory?
Odgovor:
Pros @CacheLookUp i situacije izvodljive za njegovo korištenje:
@CacheLookUp je izvediv kada su elementi statični ili se uopće ne mijenjaju dok se stranica učitava. Takvi elementi ne mijenjaju vrijeme izvođenja. U takvim slučajevima preporučljivo je upotrijebiti bilješku za poboljšanje ukupne brzine izvođenja testa.
Protiv napomene @CacheLookUp:
Najveća loša strana predmemoriranja elemenata s napomenom je strah od čestog dobivanja StaleElementReferenceExceptions.
Dinamički se elementi osvježavaju prilično često s onima koji su osjetljivi na brzu promjenu tijekom nekoliko sekundi ili minuta vremenskog intervala.
Ispod je nekoliko takvih primjera dinamičkih elemenata:
- Imati štopericu na web stranici koja se neprekidno ažurira svake sekunde.
- Okvir koji stalno ažurira vremensko izvješće.
- Stranica koja izvještava o ažuriranjima Sensexa uživo.
Oni uopće nisu idealni ili izvedivi za upotrebu napomene @CacheLookUp. Ako to učinite, riskirate da dobijete iznimku StaleElementReferenceExceptions.
Na predmemoriranju takvih elemenata, tijekom izvođenja testa, mijenja se DOM elemenata, no upravljački program traži verziju DOM-a koja je već bila spremljena tijekom predmemoriranja. Zbog toga upravljački program koji više ne postoji na web stranici mora potražiti ustajali element. Zbog toga se baca StaleElementReferenceException.
Tvorničke klase:
Pagefactory je koncept izgrađen na više tvorničkih klasa i sučelja. Ovdje ćemo u ovom odjeljku naučiti nekoliko tvorničkih klasa i sučelja. Nekoliko od njih koje ćemo pogledati jesu AjaxElementLocatorFactory , ElementLocatorFactory i DefaultElementFactory.
Jesmo li se ikad zapitali pruža li Pagefactory bilo koji način za uključivanje Implicitnog ili Eksplicitnog čekanja elementa dok se ne ispuni određeni uvjet ( Primjer: Sve dok element nije vidljiv, omogućen, na njega se može kliknuti itd.)? Ako je odgovor da, evo odgovarajućeg odgovora na to.
AjaxElementLocatorFactory jedan je od značajnih suradnika među svim tvorničkim klasama. Prednost AjaxElementLocatorFactory je što možete dodijeliti vrijednost vremenskog ograničenja web elementu klasi Object page.
Iako Pagefactory ne nudi eksplicitnu značajku čekanja, postoji varijanta implicitnog čekanja pomoću klase AjaxElementLocatorFactory . Ova se klasa može koristiti ugrađeno kada aplikacija koristi Ajax komponente i elemente.
Evo kako to implementirate u kod. Unutar konstruktora, kada koristimo metodu initElements (), možemo koristiti AjaxElementLocatorFactory da pružimo implicitno čekanje na elemente.
PageFactory.initElements(driver, this); can be replaced with PageFactory.initElements( new AjaxElementLocatorFactory(driver, 20), this);
Gornji drugi redak koda implicira da će vozač postaviti vremensko ograničenje od 20 sekundi za sve elemente na stranici kada se svako njegovo učitavanje i ako bilo koji element ne bude pronađen nakon čekanja od 20 sekundi, baci 'NoSuchElementException' za taj nedostajući element.
Također možete definirati čekanje kao u nastavku:
public pageFactoryClass(WebDriver driver) { ElementLocatorFactory locateMe = new AjaxElementLocatorFactory(driver, 30); PageFactory.initElements(locateMe, this); this.driver = driver; }
Gornji kod savršeno funkcionira jer klasa AjaxElementLocatorFactory implementira sučelje ElementLocatorFactory.
Ovdje se nadređeno sučelje (ElementLocatorFactory) odnosi na objekt podređene klase (AjaxElementLocatorFactory). Stoga se Java koncept 'nadogradnje' ili 'runtime polimorfizma' koristi tijekom dodjeljivanja vremenskog ograničenja pomoću AjaxElementLocatorFactory.
S obzirom na to kako tehnički radi, AjaxElementLocatorFactory prvo stvara AjaxElementLocator pomoću SlowLoadableComponent koji možda nije završio učitavanje kada se load () vrati. Nakon poziva za učitavanje (), metoda isLoaded () trebala bi nastaviti s neuspjehom sve dok se komponenta potpuno ne učita.
Drugim riječima, svi će se elementi svježe potražiti svaki put kada se elementu pristupi u kodu pozivanjem poziva locator.findElement () iz klase AjaxElementLocator koji zatim primjenjuje vremensko ograničenje do učitavanja kroz klasu SlowLoadableComponent.
Uz to, nakon dodjele vremenskog ograničenja putem AjaxElementLocatorFactory, elementi s oznakom @CacheLookUp više neće biti u predmemoriji jer će napomena biti zanemarena.
Postoji i varijacija kako možeš nazovite initElements () metoda i kako vi ne bi trebao nazovite AjaxElementLocatorFactory za dodjeljivanje vremenskog ograničenja za element.
# 1) Također možete navesti ime elementa umjesto objekta upravljačkog programa, kao što je prikazano dolje u metodi initElements ():
PageFactory.initElements( , this);
initElements () metoda u gornjoj varijanti interno poziva poziv na klasu DefaultElementFactory i konstruktor DefaultElementFactory prihvaća objekt sučelja SearchContext kao ulazni parametar. Objekt web-pokretača i web-element pripadaju sučelju SearchContext.
U tom će se slučaju initElements () metoda unaprijed inicijalizirati samo na spomenuti element i neće se inicijalizirati svi elementi na web stranici.
#dva) Međutim, evo zanimljivog preokreta u ovoj činjenici koji navodi kako objekt AjaxElementLocatorFactory ne biste trebali nazivati na specifičan način. Ako upotrijebim gornju varijantu initElements () zajedno s AjaxElementLocatorFactory, tada neće uspjeti.
Primjer: Kôd u nastavku, tj. Prosljeđivanje imena elementa umjesto objekta upravljačkog programa definiciji AjaxElementLocatorFactory neće uspjeti jer konstruktor za klasu AjaxElementLocatorFactory uzima samo objekt web upravljačkog programa kao ulazni parametar i stoga objekt SearchContext s web elementom za njega ne bi radio.
PageFactory.initElements(new AjaxElementLocatorFactory(, 10), this);
P # 8) Je li upotreba Pagefactory izvediva opcija u odnosu na uobičajeni obrazac dizajna objekta stranice?
Odgovor: Ovo je najvažnije pitanje koje ljudi imaju i zato sam ga pomislio riješiti na kraju tutorijala. Sada znamo „ulaz i izlaz“ za Pagefactory počevši od njegovih koncepata, korištenih napomena, dodatnih značajki koje podržava, implementacije putem koda, prednosti i nedostatke.
Ipak, ostajemo pri ovom ključnom pitanju da ako pagefactory ima toliko dobrih stvari, zašto se ne bismo držali njegove upotrebe.
Pagefactory dolazi s konceptom CacheLookUp-a za koji smo vidjeli da nije izvediv za dinamičke elemente poput vrijednosti elementa koji se često ažuriraju. Dakle, pagefactory bez CacheLookUpa, je li dobra opcija za odlazak? Da, ako su xpathovi statični.
Međutim, propast je u tome što je moderno doba aplikacija ispunjena teškim dinamičkim elementima gdje znamo da dizajn objekta stranice bez pagefactory-a u konačnici dobro funkcionira, ali radi li koncept pagefactory-a jednako dobro s dinamičkim xpaths-ima? Možda ne. Evo kratkog primjera:
Na web stranici nseindia.com vidimo tablicu kako je dolje data.

Put puta tablice je
'//*(@id='tab9Content')/table/tbody/tr(+count+)/td(1)'
Iz svakog retka želimo dohvatiti vrijednosti za prvi stupac ‘Kupi količinu’. Da bismo to učinili, trebat ćemo povećati brojač redaka, ali indeks stupaca ostat će 1. Ne postoji način na koji možemo proslijediti ovaj dinamični XPath u bilješci @FindBy jer napomena prihvaća vrijednosti koje su statične i ne može se proslijediti nijedna varijabla to.
Ovdje fabrika stranica u potpunosti zakazuje dok uobičajeni POM izvrsno funkcionira s njom. Možete lako koristiti petlju for za povećanje indeksa retka koristeći takve dinamičke xpath-ove u driver.findElement () metodi.
Zaključak
Page Object Model je koncept dizajna ili obrazac koji se koristi u okviru automatizacije Selenium.
Konvekcija metoda imenovanjem je jednostavna za upotrebu u objektnom modelu stranice. Kôd u POM-u lako je razumljiv, ponovno se može koristiti i održavati. Ako u POM-u dođe do bilo kakve promjene u web elementu, dovoljno je unijeti promjene u njegovu klasu, a ne uređivati sve klase.
Pagefactory, baš kao i uobičajeni POM, prekrasan je koncept za primjenu. Međutim, moramo znati gdje je uobičajeni POM izvediv i gdje Pagefactory dobro odgovara. U statičkim aplikacijama (gdje su i XPath i elementi statični), Pagefactory se može liberalno implementirati uz dodane prednosti boljih performansi.
Alternativno, kada aplikacija uključuje i dinamičke i statičke elemente, možda imate mješovitu implementaciju pom sa Pagefactory i onom bez Pagefactory prema izvedivosti za svaki web element.
Autor: Ovaj je priručnik napisao Shobha D. Radi kao voditeljica projekta i dolazi s više od 9 godina iskustva u ručnom rukovanju, automatizaciji (Selenium, IBM Rational Functional Tester, Java) i API testiranju (SOAPUI i Budite sigurni u Javi) .
A sada za vas, za daljnju implementaciju Pagefactory-a.
Sretno istraživanje !!!
=> Posjetite ovdje da biste naučili selen iz ogrebotina.
Preporučena literatura
- 30+ najboljih vodiča za selen: naučite selen na stvarnim primjerima
- Učinkoviti scenariji za skriptiranje i rješavanje problema sa selenijem - Vodič za selenij br. 27
- Otklanjanje pogrešaka u skriptama za selen sa zapisnicima (Vodič za Log4j) - Vodič za selen # 26
- Uvod u JUnit Framework i njegovu upotrebu u skripti za selenij - Vodič za selen br. 11
- 7 čimbenika koji utječu na procjenu ispitivanja projekta automatizacije selena - Vodič za selen br. 32
- Tvrdnje u selenu korištenjem Junit i TestNG okvira
- Kako se koristi TestNG Framework za stvaranje skripti za selen - TestNG Selen Tutorial # 12
- Naučite kako koristiti TestNG napomene u selenu (s primjerima)