page object model with page factory selenium tutorial
Ta poglobljena vadnica pojasnjuje vse o predmetnem modelu strani (POM) s primeri primerov Pagefactory. Izvedbe POM v selenu se lahko tudi naučite:
V tej vadnici bomo razumeli, kako ustvariti objektni model strani s pristopom Page Factory. Osredotočili se bomo na:
- Tovarniški razred
- Kako ustvariti osnovni POM z uporabo tovarniškega vzorca strani
- Različni komentarji, uporabljeni v pristopu tovarniške strani
Preden bomo videli, kaj je Pagefactory in kako ga je mogoče uporabiti skupaj z objektnim modelom Page, razberemo, kaj je Page Object Model, ki je splošno znan kot POM.
=> Obiščite tukaj, da si ogledate serijo treningov za selen za vse.
Kaj se boste naučili:
- Kaj je objektni model strani (POM)?
- Kaj je Pagefactory?
- POM z uporabo Page Factory
- Pogosto zastavljena vprašanja
- Zaključek
Kaj je objektni model strani (POM)?
Teoretična terminologija opisuje Predmetni model strani kot vzorec oblikovanja, ki se uporablja za izdelavo skladišča predmetov za spletne elemente, ki so na voljo v preizkušeni aplikaciji. Le redki se nanjo sklicujejo kot na okvir za avtomatizacijo selena za dano testirano aplikacijo.
Kar pa razumem pri pojmu Page Object Model, je:
# 1) To je vzorčni načrt, kjer imate ločeno datoteko razreda Java, ki ustreza vsakemu zaslonu ali strani v aplikaciji. Datoteka razreda lahko vključuje repozitorij predmetov elementov uporabniškega vmesnika in metode.
#two) Če na strani obstajajo gromozanski spletni elementi, lahko razred repozitorija predmetov za stran ločimo od razreda, ki vključuje metode za ustrezno stran.
Primer: Če ima stran Registriraj račun veliko vnosnih polj, lahko obstaja razred RegisterAccountObjects.java, ki tvori repozitorij predmetov za elemente uporabniškega vmesnika na strani računov računov.
Lahko bi ustvarili ločeno datoteko razreda RegisterAccount.java, ki razširja ali podeduje RegisterAccountObjects, ki vključuje vse metode, ki izvajajo različna dejanja na strani.
# 3) Poleg tega je pod paketom lahko generični paket z datoteko {roperties, preskusnimi podatki Excel in skupnimi metodami.
Primer: DriverFactory, ki bi ga lahko zelo enostavno uporabili na vseh straneh v aplikaciji
Razumevanje POM s primerom
Preveri tukaj če želite izvedeti več o POM.
Spodaj je posnetek spletne strani:
S klikom na vsako od teh povezav boste uporabnika preusmerili na novo stran.
Tu je posnetek, kako je zasnovana struktura projekta s selenijem z uporabo objektnega modela Page, ki ustreza vsaki strani na spletnem mestu. Vsak razred Java vključuje skladišče predmetov in metode za izvajanje različnih dejanj na strani.
Poleg tega bo na voljo še ena datoteka JUNIT ali TestNG ali datoteka razreda Java, ki prikliče klice datotek razredov teh strani.
Zakaj uporabljamo objektni model strani?
O uporabi tega zmogljivega ogrodja Selenium, imenovanega POM ali objektni model strani, se širi glasba. Zdaj se postavlja vprašanje 'Zakaj uporabljati POM?'.
Preprost odgovor na to je, da je POM kombinacija podatkovnih, modularnih in hibridnih okvirov. Gre za pristop k sistematični organizaciji skriptov na tak način, da QA olajša vzdrževanje kode brez težav in pomaga preprečiti odvečno ali podvojeno kodo.
Na primer, če pride do spremembe vrednosti lokatorja na določeni strani, je zelo enostavno prepoznati in hitro spremeniti samo skript zadevne strani, ne da bi to vplivalo na kodo drugje.
Koncept objektnega modela strani uporabljamo v programu Selenium Webdriver iz naslednjih razlogov:
- V tem modelu POM je ustvarjeno repozitorij predmetov. Je neodvisen od testnih primerov in ga je mogoče ponovno uporabiti za drug projekt.
- Konvencija poimenovanja metod je zelo enostavna, razumljiva in bolj realistična.
- V predmetnem modelu Page ustvarimo razrede strani, ki jih je mogoče ponovno uporabiti v drugem projektu.
- Objektni model Page je za razvite okvire enostaven zaradi številnih prednosti.
- V tem modelu so ustvarjeni ločeni razredi za različne strani spletne aplikacije, kot so prijavna stran, domača stran, stran s podrobnostmi o zaposlenem, stran za spremembo gesla itd.
- Če se kateri koli element spletnega mesta spremeni, potem moramo spremeniti le en razred in ne vseh razredov.
- Zasnovan skript je bolj uporaben, berljiv in vzdrževan v pristopu k objektnemu modelu strani.
- Njegova struktura projekta je dokaj enostavna in razumljiva.
- Lahko uporabi PageFactory v objektnem modelu strani za inicializacijo spletnega elementa in shranjevanje elementov v predpomnilnik.
- TestNG lahko vključimo tudi v pristop Page Object Model.
Uporaba enostavnega POM v selenu
# 1) Scenarij za avtomatizacijo
Zdaj avtomatiziramo dani scenarij z uporabo objektnega modela strani.
Scenarij je razložen spodaj:
Korak 1: Zaženite spletno mesto »https: //demo.vtiger.com«.
2. korak: Vnesite veljavno poverilnico.
3. korak: Prijavite se na spletno mesto.
4. korak: Preverite domačo stran.
5. korak: Odjavite se s spletnega mesta.
6. korak: Zaprite brskalnik.
# 2) Scenariji za selen za zgornji scenarij v POM
Zdaj v Eclipse ustvarimo strukturo POM, kot je razloženo spodaj:
Korak 1: Ustvarite projekt v Eclipse - POM Struktura:
a) Ustvarite projekt “Model predmeta strani”.
b) Ustvari paket 3 v okviru projekta.
- knjižnica
- strani
- testni primeri
Knjižnica: Pod to smo postavili tiste kode, ki jih je treba znova in znova klicati v naših testnih primerih, kot je zagon brskalnika, posnetki zaslona itd. Uporabnik lahko doda več razredov pod to možnostjo glede na potrebe projekta.
Strani: Pod tem so razredi ustvarjeni za vsako stran v spletni aplikaciji in lahko dodajo več razredov strani glede na število strani v aplikaciji.
Testni primeri: Pod tem napišemo testni primer prijave in lahko dodamo več testnih primerov, kot je potrebno za preizkus celotne aplikacije.
c) Razredi pod paketi so prikazani na spodnji sliki.
Korak dva: V knjižničnem paketu ustvarite naslednje razrede.
Browser.java: V tem razredu so opredeljeni 3 brskalniki (Firefox, Chrome in Internet Explorer), ki se pokličejo v testnem primeru prijave. Na podlagi zahteve lahko uporabnik aplikacijo preizkusi tudi v različnih brskalnikih.
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: V tem razredu je napisan program za posnetek zaslona, ki se v testnem primeru pokliče, ko uporabnik želi narediti posnetek zaslona, ali preizkus ne uspe ali opravi.
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(); } } }
3. korak: Ustvarite razrede strani v paketu Page.
HomePage.java: To je razred Domača stran, v katerem so definirani vsi elementi domače strani in 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: To je razred strani za prijavo, v katerem so definirani vsi elementi strani za prijavo in 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(); } }
4. korak: Ustvari testne primere za scenarij prijave.
LoginTestCase.java: To je razred LoginTestCase, kjer se izvaja testni primer. Uporabnik lahko ustvari tudi več testnih primerov glede na potrebe 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(); } }
5. korak: Izvedite “LoginTestCase.java“.
6. korak: Rezultat objektnega modela strani:
- Zaženite brskalnik Chrome.
- Predstavitveno spletno mesto se odpre v brskalniku.
- Prijavite se na predstavitveno spletno mesto.
- Preverite domačo stran.
- Odjavite se s spletnega mesta.
- Zaprite brskalnik.
Zdaj pa raziščimo glavni koncept te vadnice, ki pritegne pozornost, tj. »Pagefactory«.
Kaj je Pagefactory?
PageFactory je način izvajanja “Model predmeta strani”. Tu sledimo načelu ločevanja odlagališč predmetov strani in testnih metod. To je vgrajeni koncept Page Object Model, ki je zelo optimiziran.
Zdaj bomo imeli več jasnosti glede izraza Pagefactory.
# 1) Prvič, koncept, imenovan Pagefactory, ponuja nadomestni način v smislu sintakse in semantike za ustvarjanje repozitorija predmetov za spletne elemente na strani.
#two) Drugič, za inicializacijo spletnih elementov uporablja nekoliko drugačno strategijo.
# 3) Skladišče predmetov za spletne elemente uporabniškega vmesnika je mogoče izdelati z uporabo:
- Običajni „POM brez Pagefactory“ in,
- Lahko pa uporabite tudi »POM z Pagefactory«.
Spodaj je slikovna predstavitev istega:
Zdaj bomo preučili vse vidike, ki razlikujejo običajni POM od POM s Pagefactory.
a) Razlika v sintaksi iskanja elementa z uporabo običajnega POM v primerjavi s POM s Pagefactory.
Na primer , Kliknite tukaj poiščite iskalno polje, ki se prikaže na strani.
POM brez Pagefactory:
# 1) Spodaj je opisano, kako poiščete iskalno polje z običajnim POM:
WebElement searchNSETxt=driver.findElement(By.id(“searchBox”));
# 2) Spodnji korak prenese vrednost »naložba« v polje Search NSE.
searchNSETxt.sendkeys(“investment”);
POM Uporaba Pagefactory:
# 1) Iskalno polje lahko poiščete s pomočjo Pagefactory, kot je prikazano spodaj.
Pripis @FindBy se uporablja v Pagefactory za identifikacijo elementa, medtem ko POM brez Pagefactory uporablja driver.findElement () metoda za iskanje elementa.
Druga izjava za Pagefactory po @FindBy je dodelitev tipa WebElement razred, ki deluje popolnoma podobno dodelitvi imena elementa tipa WebElement kot povratni tip metode driver.findElement () ki se uporablja v običajnem POM (v tem primeru poiščiteNSETxt).
Ogledali si bomo @FindBy podrobneje v naslednjem delu te vadnice.
@FindBy(id = 'searchBox') WebElement searchNSETxt;
#two) Spodnji korak prenese vrednost »naložba« v polje Search NSE in sintaksa ostane enaka kot pri običajnem POM (POM brez Pagefactory).
searchNSETxt.sendkeys(“investment”);
b) Razlika v strategiji inicializacije spletnih elementov z uporabo običajnega POM v primerjavi s POM s Pagefactory.
Uporaba POM brez Pagefactory:
Spodaj je delček kode za nastavitev poti gonilnika Chrome. Primerek WebDriver se ustvari z imenom gonilnik, ChromeDriver pa je dodeljen 'gonilniku'. Nato se isti objekt gonilnika uporabi za zagon spletnega mesta Nacionalne borze vrednostnih papirjev, iskanje iskalnega polja in v polje vrednosti vnesite vrednost niza.
Bistvo, ki bi ga rad tukaj poudaril, je, da ko gre za POM brez tovarniške strani, se primerek gonilnika ustvari na začetku in vsak spletni element se sveže inicializira vsakič, ko se ta spletni element pokliče s pomočjo driver.findElement () ali gonilnika .findElements ().
Zato se z novim korakom driver.findElement () za element znova pregleda DOM struktura in na tej strani opravi osvež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”);
Uporaba POM z Pagefactory:
Poleg uporabe pripisa @FindBy namesto metode driver.findElement () se spodnji delček kode uporablja tudi za Pagefactory. Metoda statičnega initElements () razreda PageFactory se uporablja za inicializacijo vseh elementov uporabniškega vmesnika na strani takoj, ko se stran naloži.
public PagefactoryClass(WebDriver driver) { this.driver = driver; PageFactory.initElements(driver, this); }
Zgornja strategija naredi pristop PageFactory nekoliko drugačen od običajnega POM. V običajnem POM je treba spletni element izrecno inicializirati, medtem ko se v pristopu Pagefactory vsi elementi inicializirajo z initElements (), ne da bi izrecno inicializirali vsak spletni element.
Na primer: Če je bil WebElement razglašen, vendar ni bil inicializiran v običajnem POM-u, se vrže napaka »inicializacija spremenljivke« ali NullPointerException. Zato je v običajnem POM treba vsak WebElement izrecno inicializirati. PageFactory ima v tem primeru prednost pred običajnim POM.
Ne inicializiramo spletnega elementa BDate (POM brez Pagefactory), lahko vidite, da se prikaže napaka 'Initialize variable' in uporabnika pozove, da jo inicializira na nič, zato ne morete domnevati, da se elementi ob njihovem iskanju implicitno inicializirajo.
Element BDate je izrecno inicializiran (POM brez Pagefactory):
Zdaj pa si oglejmo nekaj primerov celotnega programa, ki uporablja PageFactory, da izključimo kakršno koli dvoumnost pri razumevanju vidika izvedbe.
Primer 1:
- Pojdite na 'http://www.nseindia.com/'
- V spustnem meniju poleg iskalnega polja izberite »Izvedeni finančni instrumenti«.
- Poiščite »USDINR«. Na strani, ki se prikaže, preverite besedilo „Ameriški dolar-indijska rupija - USDINR“.
Struktura programa:
- Ustvari se PagefactoryClass.java, ki vključuje repozitorij predmetov z uporabo koncepta tovarniške strani za nseindia.com, ki je konstruktor za inicializacijo vseh spletnih elementov, metoda selectCurrentDerivative () za izbiro vrednosti v spustnem polju Iskalno polje, izberiteSimbol (), da izberete simbol na stran, ki se prikaže naslednja, in verifytext (), da preverite, ali je glava strani pričakovana ali ne.
- NSE_MainClass.java je datoteka glavnega razreda, ki prikliče vse zgoraj navedene metode in izvede ustrezna dejanja na spletnem mestu NSE.
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 2. primer:
- Pojdite na »https://www.shoppersstop.com/brands«
- Pomaknite se do povezave Haute curry.
- Preverite, ali stran Haute Curry vsebuje besedilo »Začni novo«.
Struktura programa
- shopperstopPagefactory.java, ki vključuje repozitorij predmetov z uporabo koncepta pagefactory za shoppersstop.com, ki je konstruktor za inicializacijo vseh spletnih elementov, ustvarjene so metode closeExtraPopup () za obdelavo pojavnega okna z opozorilom, klikniteOnHauteCurryLink (), da kliknete Haute Curry Povežite in preveriteStartNewSomething (), da preverite, ali stran Haute Curry vsebuje besedilo »Začni novo«.
- Shopperstop_CallPagefactory.java je glavna datoteka razreda, ki prikliče vse zgoraj navedene metode in izvede ustrezna dejanja na spletnem mestu NSE.
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 z uporabo Page Factory
Video vaje - POM s tovarno strani
I. del
2. del
Tovarniški razred se uporablja za poenostavitev in lažjo uporabo predmetov strani.
- Najprej moramo spletne elemente poiskati s pripisi @FindBy pri pouku strani .
- Nato inicializirajte elemente z uporabo initElements () med instantacijo razreda strani.
# 1) @FindBy:
Pripis @FindBy se uporablja v PageFactory za iskanje in razglasitev spletnih elementov z uporabo različnih lokatorjev.Tu posredujemo atribut in njegovo vrednost, uporabljeno za iskanje spletnega elementa, pripisu @FindBy, nato pa je razglašen WebElement.
Pripis je mogoče uporabiti na dva načina.
Na primer:
@FindBy(how = How.ID, using='EmailAddress') WebElement Email; @FindBy(id='EmailAddress') WebElement Email;
Vendar je prvi standardni način prijave WebElements.
'Kako' je razred in ima statične spremenljivke, kot so ID, XPATH, CLASSNAME, LINKTEXT itd.
'Uporaba' - Če želite statični spremenljivki dodeliti vrednost.
V zgornjem primer , smo uporabili atribut ‘id’ za iskanje spletnega elementa ‘Email’. Podobno lahko s pripisi @FindBy uporabimo naslednje lokatorje:
- className
- css
- ime
- xpath
- tagName
- linkText
- delnoLinkText
# 2) initElements ():
InitElements je statična metoda razreda PageFactory, ki se uporablja za inicializacijo vseh spletnih elementov, ki se nahajajo v pripisu @FindBy. Tako enostavno ustvarjanje primerkov za razrede Page.
initElements(WebDriver driver, java.lang.Class pageObjectClass)
Prav tako bi morali razumeti, da POM sledi načelom OOPS.
- WebElements so deklarirani kot spremenljivke zasebnih članov (Skrivanje podatkov).
- Vezava spletnih elementov z ustreznimi metodami (enkapsulacija).
Koraki za ustvarjanje POM z uporabo tovarniškega vzorca strani
# 1) Za vsako spletno stran ustvarite ločeno datoteko razreda Java.
#two) V vsakem razredu je treba vse elemente WebElements deklarirati kot spremenljivke (z uporabo pripisa - @FindBy) in inicializirati z metodo initElement (). Deklarirani WebElements je treba inicializirati, da se bodo uporabljali v akcijskih metodah.
# 3) Določite ustrezne metode, ki delujejo na te spremenljivke.
Vzemimo primer preprostega scenarija:
- Odprite URL aplikacije.
- Vnesite e-poštni naslov in podatke o geslu.
- Kliknite gumb Prijava.
- Na strani za iskanje preverite uspešno prijavno sporočilo.
Sloj strani
Tukaj imamo 2 strani,
- Domača stran - Stran, ki se odpre ob vnosu URL-ja in kamor vnesemo podatke za prijavo.
- SearchPage - Stran, ki se prikaže po uspešni prijavi.
V sloju strani je vsaka stran v spletni aplikaciji deklarirana kot ločen razred Java in tam so omenjeni njeni lokatorji in dejanja.
Koraki za ustvarjanje POM s primerom v realnem času
# 1) Ustvari razred Java za vsako stran:
V tem primer , odprli bomo 2 spletni strani, strani »Domov« in »Iskanje«.
Zato bomo v sloju strani ustvarili dva razreda Java (ali v paketu recimo com.automation.pages).
Package Name :com.automation.pages HomePage.java SearchPage.java
# 2) Določite WebElements kot spremenljivke s pomočjo Annotation @FindBy:
V interakciji bi bili z:
- E-pošta, geslo, polje gumba za prijavo na domači strani.
- Uspešno sporočilo na strani za iskanje.
Torej bomo opredelili WebElements s pomočjo @FindBy
Na primer: Če bomo EmailAddress prepoznali z uporabo atributa id, potem je njegova izjava spremenljivke
//Locator for EmailId field @FindBy(how=How.ID,using='EmailId') private WebElementEmailIdAddress;
# 3) Ustvarite metode za dejanja, izvedena na WebElements.
Spodaj se izvedejo dejanja na WebElements:
- V polje Action Address vnesite dejanje.
- V polje Geslo vnesite dejanje.
- Kliknite dejanje na gumbu za prijavo.
Na primer, Uporabniško določene metode se ustvarijo za vsako dejanje na WebElementu kot,
public void typeEmailId(String Id){ driver.findElement(EmailAddress).sendKeys(Id) }
Tu se Id posreduje kot parameter v metodi, saj bo uporabnik vhod poslal iz glavnega testnega primera.
Opomba :Konstruktor je treba ustvariti v vsakem razredu v sloju strani, da dobimo primerek gonilnika iz glavnega razreda v preizkusni plasti in tudi inicializiramo WebElements (Page Objects), razglašene v razredu strani, z uporabo PageFactory.InitElement () .
Tu ne zaženemo gonilnika, temveč njegov primerek prejme glavni razred, ko je ustvarjen predmet razreda Page Layer.
InitElement () - se uporablja za inicializacijo prijavljenih WebElements z uporabo primerka gonilnika iz glavnega razreda. Z drugimi besedami, WebElements se ustvarijo z uporabo primerka gonilnika. Šele po inicializaciji WebElements jih je mogoče uporabiti v metodah za izvajanje dejanj.
Za vsako stran sta ustvarjena dva Java razreda, kot je prikazano spodaj:
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. } }
Preskusni sloj
V tem razredu so izvedeni testni primeri. Ustvarimo ločen paket recimo com.automation.test in nato tukaj ustvarimo razred Java (MainClass.java)
Koraki za ustvarjanje testnih primerov:
- Inicializirajte gonilnik in odprite aplikacijo.
- Ustvarite objekt razreda PageLayer (za vsako spletno stran) in primerek gonilnika posredujte kot parameter.
- Z ustvarjenim predmetom pokličite metode v razredu PageLayer Class (za vsako spletno stran), da izvedete dejanja / preverjanje.
- Ponavljajte 3. korak, dokler se ne izvedejo vsa dejanja, in nato zaprite gonilnik.
//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(); } }
Hierarhija vrste pripisov, uporabljena za prijavo spletnih elementov
Pripisi se uporabljajo za oblikovanje lokacijske strategije za elemente uporabniškega vmesnika.
# 1) @FindBy
Ko gre za Pagefactory, @FindBy deluje kot čarobna palica. Konceptu doda vso moč. Zdaj se zavedate, da pripis @FindBy v Pagefactory deluje enako kot pri driver.findElement () v običajnem objektnem modelu strani. Uporablja se za iskanje WebElement / WebElements z enim merilom .
# 2) @FindBys
Uporablja se za iskanje WebElementa z več meril in morajo ustrezati vsem navedenim merilom. Ta merila je treba omeniti v razmerju med starši in otroki. Z drugimi besedami, to uporablja pogojno razmerje AND za iskanje spletnih elementov z uporabo določenih meril. Za definiranje vsakega merila uporablja večkratnik @FindBy.
Na primer:
Izvorna koda HTML WebElementa:
V POM:
@FindBys({ @FindBy(id = 'searchId_1'), @FindBy(name = 'search_field') }) WebElementSearchButton;
V zgornjem primeru je WebElement „SearchButton“ nameščen le, če je se ujema z obema merila, katerih vrednost id je 'searchId_1', vrednost imena pa 'search_field'. Upoštevajte, da prva merila pripadajo nadrejeni oznaki, druga pa za nadrejeno oznako.
# 3) @FindAll
Uporablja se za iskanje WebElementa z več meril in mora ustrezati vsaj enemu od danih kriterijev. Ta uporablja pogojne relacije ALI za iskanje WebElements. Za definiranje vseh meril uporablja večkratnik @FindBy.
Na primer:
HTML SourceCode:
V POM:
@FindBys({ @FindBy(id = 'UsernameNameField_1'), // doesn’t match @FindBy(name = 'User_Id') //matches @FindBy(className = “UserName_r”) //matches }) WebElementUserName;
V zgornjem primeru se nahaja uporabniško ime WebElement, če je se ujema z vsaj enim navedenih meril.
# 4) @CacheLookUp
Ko se WebElement pogosteje uporablja v testnih primerih, Selenium vsakič, ko se zažene testni skript, poišče WebElement. V tistih primerih, kjer se nekateri WebElements globalno uporabljajo za vse TC ( Na primer, Scenarij prijave se zgodi za vsak TC), ta pripis lahko uporabite za vzdrževanje teh WebElements v začasnem pomnilniku, ko je prvič prebran.
To pa pripomore k hitrejšemu izvajanju kode, saj vsakič, ko ni treba iskati WebElementa na strani, lahko pa sklic dobi iz pomnilnika.
To je lahko predpona s katerim koli od @FindBy, @FindBys in @FindAll.
Na primer:
@CacheLookUp @FindBys({ @FindBy(id = 'UsernameNameField_1'), @FindBy(name = 'User_Id') @FindBy(className = “UserName_r”) }) WebElementUserName;
Upoštevajte tudi, da je treba ta pripis uporabljati samo za WebElements, katerih vrednost atributa (na primer xpath, ime id, ime razreda itd.) Se ne spreminja pogosto. Ko je WebElement prvič, ohrani svojo referenco v začasnem pomnilniku.
Torej potem pride do spremembe atributa WebElementa po nekaj dneh, Selenium ne bo mogel najti elementa, ker ima v predpomnilniku že staro referenco in ne bo upošteval nedavne spremembe WebElementa.
Več na strani PageFactory.initElements ()
Zdaj, ko razumemo strategijo Pagefactoryja za inicializacijo spletnih elementov z uporabo InitElements (), poskusimo razumeti različne različice metode.
Metoda, kot jo poznamo, za vhodne parametre vzame objekt gonilnika in objekt trenutnega razreda in vrne objekt strani z implicitno in proaktivno inicializacijo vseh elementov na strani.
V praksi je uporaba konstruktorja, kot je prikazano v zgornjem poglavju, bolj zaželena kot drugi načini njegove uporabe.
Alternativni načini klicanja metode so:
# 1) Namesto da uporabite kazalec “this”, lahko ustvarite trenutni objekt razreda, mu posredujete primerek gonilnika in pokličete statično metodo initElements s parametri, tj. Objekt voznika in objekt razreda, ki je bil pravkar ustvarjen.
public PagefactoryClass(WebDriver driver) { //version 2 PagefactoryClass page=new PagefactoryClass(driver); PageFactory.initElements(driver, page); }
#two) Tretji način za inicializacijo elementov z uporabo razreda Pagefactory je uporaba api, imenovanega »odsev«. Da, namesto da bi ustvarili objekt razreda z “novo” ključno besedo, lahko classname.class posredujemo kot del vhodnega parametra initElements ().
public PagefactoryClass(WebDriver driver) { //version 3 PagefactoryClass page=PageFactory.initElements(driver, PagefactoryClass.class); }
Pogosto zastavljena vprašanja
V # 1) Katere so različne strategije lociranja, ki se uporabljajo za @FindBy?
Odgovor: Preprost odgovor na to je, da za @FindBy ne obstajajo različne strategije lociranja.
Uporabljajo enakih 8 lokacijskih strategij, kot jih uporablja metoda findElement () v običajnem POM:
- id
- ime
- className
- xpath
- css
- tagName
- linkText
- delnoLinkText
V # 2) Ali obstajajo tudi različice za uporabo pripisov @FindBy?
Odgovor: Kadar je treba iskati spletni element, uporabimo pripis @FindBy. Obdelali bomo alternativne načine uporabe @FindBy skupaj z različnimi lokatorskimi strategijami.
Že smo videli, kako uporabljati različico 1 @FindBy:
@FindBy(id = 'cidkeyword') WebElement Symbol;
Različica 2 @FindBy je tako, da vhodni parameter prenesete kot Kako in Uporaba .
Kako išče lokacijsko strategijo, s pomočjo katere bi bil identificiran element orožja. Ključna beseda uporabo definira vrednost lokatorja.
Glejte spodaj za boljše razumevanje,
- How.ID išče element z uporabo id strategija in element, ki ga skuša prepoznati, ima id = cidkeyword.
@FindBy(how = How.ID, using = ' cidkeyword') WebElement Symbol;
- How.CLASS_NAME išče element z uporabo className strategija in element, ki ga skuša prepoznati, ima class = nov razred.
@FindBy(how = How.CLASS_NAME, using = 'newclass') WebElement Symbol;
V # 3) Ali obstaja razlika med obema različicama @FindBy?
Odgovor: Odgovor je Ne, med obema različicama ni razlike. Preprosto je prva različica krajša in lažja v primerjavi z drugo različico.
V # 4) Kaj naj uporabljam v tovarni strani, če obstaja seznam spletnih elementov, ki jih je treba najti?
Odgovor: V običajnem vzorcu oblikovanja predmetov strani imamo driver.findElements () za iskanje več elementov, ki pripadajo istemu razredu ali imenu oznake, toda kako najdemo take elemente v primeru objektnega modela strani s Pagefactory? Takšne elemente najlažje dosežemo tako, da uporabimo isti pripis @FindBy.
Razumem, da se zdi, da je ta vrstica za mnoge od vas praskalnik po glavi. Ampak ja, to je odgovor na vprašanje.
Oglejmo si spodnji primer:
Z običajnim objektnim modelom strani brez Pagefactoryja uporabite driver.findElements za iskanje več elementov, kot je prikazano spodaj:
private List multipleelements_driver_findelements = driver.findElements (By.class(“last”));
Enako lahko dosežemo z uporabo objektnega modela strani s Pagefactory, kot je navedeno spodaj:
@FindBy (how = How.CLASS_NAME, using = 'last') private List multipleelements_FindBy;
V bistvu dodeljevanje elementov seznamu vrste WebElement naredi trik ne glede na to, ali je bil Pagefactory uporabljen med prepoznavanjem in lociranjem elementov.
V # 5) Ali je mogoče v istem programu uporabiti tako oblikovanje predmetov Page brez stranifactory kot tudi Pagefactory?
Odgovor: Da, v istem programu je mogoče uporabiti tako oblikovanje predmetov strani brez Pagefactory kot tudi Pagefactory. Lahko greste skozi spodnji program v Odgovor na 6. vprašanje da vidite, kako se obe uporabljata v programu.
Ne smemo si pozabiti, da se je pri dinamičnih elementih treba izogibati konceptu Pagefactory s predpomnjeno funkcijo, medtem ko oblikovanje predmetov strani dobro deluje pri dinamičnih elementih. Vendar Pagefactory ustreza samo statičnim elementom.
V # 6) Ali obstajajo alternativni načini prepoznavanja elementov na podlagi več meril?
Vprašanja in odgovori za testiranje mobilnih aplikacij
Odgovor: Alternativa za prepoznavanje elementov na podlagi več meril je uporaba pripisov @FindAll in @FindBys. Ti pripisi pomagajo prepoznati posamezne ali več elementov, odvisno od vrednosti, pridobljenih iz v njem podanih meril.
# 1) @FindAll:
@FindAll lahko vsebuje več @FindBy in vrne vse elemente, ki se ujemajo s katerim koli @FindBy na enem seznamu. @FindAll se uporablja za označevanje polja na predmetu strani, ki označuje, da mora iskanje uporabiti vrsto oznak @FindBy. Nato bo poiskal vse elemente, ki ustrezajo kateremu koli od meril FindBy.
Upoštevajte, da elementi niso zagotovljeni v vrstnem redu dokumentov.
Sintaksa za uporabo @FindAll je naslednja:
@FindAll( { @FindBy(how = How.ID, using = 'foo'), @FindBy(className = 'bar') } )
Pojasnilo: @FindAll bo iskal in identificiral ločene elemente, ki ustrezajo vsakemu od meril @FindBy, in jih navedel. V zgornjem primeru bo najprej poiskal element, katerega id = ”foo”, nato pa bo drugi element identificiral s className = ”bar”.
Ob predpostavki, da je bil za vsak kriterij FindBy določen en element, bo @FindAll povzročil seznam 2 elementov. Ne pozabite, da je za vsako merilo lahko identificiranih več elementov. Tako s preprostimi besedami @ Najdi vse deluje enako kot ALI operater na sprejetih merilih @FindBy.
# 2) @FindBys:
FindBys se uporablja za označevanje polja na predmetu strani, ki označuje, da mora iskanje uporabljati vrsto oznak @FindBy v verigi, kot je opisano v ByChained. Ko se morajo zahtevani predmeti WebElement ujemati z vsemi navedenimi merili, uporabite pripis @FindBys.
Sintaksa za uporabo @FindBys je naslednja:
@FindBys( { @FindBy(name=”foo”) @FindBy(className = 'bar') } )
Pojasnilo: @FindBys bo iskal in identificiral elemente, ki ustrezajo vsem merilom @FindBy, in jih navedel. V zgornjem primeru bo iskal elemente, katerih ime = 'foo' in className = 'bar'.
Rezultat funkcije @FindAll bo navedel 1 element, če predpostavimo, da je bil v danih merilih en element identificiran z imenom in imenom className.
Če noben element ne izpolnjuje vseh posredovanih pogojev FindBy, bo rezultat @FindBys nič elementov. Lahko bi bil določen seznam spletnih elementov, če vsi pogoji izpolnjujejo več elementov. Z enostavnimi besedami @ FindBys deluje enako kot IN operater na sprejetih merilih @FindBy.
Oglejmo si izvajanje vseh zgornjih pripisov s podrobnim programom:
Spremenili bomo program www.nseindia.com, naveden v prejšnjem razdelku, da bomo razumeli izvajanje pripisov @FindBy, @FindBys in @FindAll
# 1) Repozitorij predmetov PagefactoryClass je posodobljen, kot je prikazano spodaj:
Seznam newlist = driver.findElements (By.tagName ('a'));
@FindBy (kako = Kako. TAG_NAME , z uporabo = 'a')
zasebno Seznam findbyvalue;
@FindAll ({ @FindBy (className = “sel”), @FindBy (xpath = '// a [@ id = 'tab5 ′]')}))
zasebno Seznam findallvalue;
@FindBys ({ @FindBy (className = “sel”), @FindBy (xpath = '// a [@ id = 'tab5 ′]')}))
zasebno Seznam findbysvalue;
# 2) Nova metoda seeHowFindWorks () je zapisana v PagefactoryClass in se prikliče kot zadnja metoda v razredu Main.
Metoda je naslednja:
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 Spodaj je prikazan rezultat, prikazan v oknu konzole po izvedbi programa:
Poskusimo zdaj podrobno razumeti kodo:
# 1) Skozi vzorec oblikovanja predmeta strani element ‘newlist’ identificira vse oznake s sidrom ‘a’. Z drugimi besedami, dobimo število vseh povezav na strani.
Izvedeli smo, da pagefactory @FindBy opravlja enako delo kot driver.findElement (). Element findbyvalue je ustvarjen za prikaz števila vseh povezav na strani prek iskalne strategije s konceptom strani.
Izkazalo se je pravilno, da oba driver.findElement () in @FindBy opravljata enako delo in identificirata iste elemente. Če si ogledate posnetek zaslona nastalega okna konzole zgoraj, je število povezav, identificiranih z elementom newlist in številom findbyvalue, enako, tj. 299 povezave na strani.
Rezultat je prikazan spodaj:
driver.findElements(By.tagName()) 299 count of @FindBy- list elements 299
#two) Tu obdelujemo delovanje pripisa @FindAll, ki se bo nanašal na seznam spletnih elementov z imenom findallvalue.
Če natančno preučimo vsa merila @FindBy v pripisu @FindAll, prva merila @FindBy iščejo elemente z className = 'sel', druga merila @FindBy pa iščejo določen element s XPath = “// a [@ id = 'tab5']
Pritisnite zdaj F12, da pregledamo elemente na strani nseindia.com in dobimo nekatere jasnosti elementov, ki ustrezajo merilom @FindBy.
Na strani sta dva elementa, ki ustrezata className = ”sel”:
do) Element »Osnove« ima oznako seznama, tj.
z className = 'sel'. Glej posnetek spodaj
b) Drugi element »Book of Order« ima XPath s sidrno oznako, ki ima ime razreda kot »sel«.
c) Drugi @FindBy s XPathom ima sidrno oznako, katere id je ' tab5 '. Kot odgovor na iskanje je opredeljen le en element, ki je Osnove.
Oglejte si posnetek spodaj:
Ko je bil izveden test nseindia.com, smo dobili število elementov, ki so jih iskali.
@FindAll as 3. Elementi za findallvalue, ko so bili prikazani, so bili: Osnove kot 0thindeksni element, knjiga naročil kot 1stindeksni element in Osnove spet kot 2ndindeksni element. Že smo se naučili, da @FindAll identificira elemente za vsako merilo @FindBy posebej.
Po istem protokolu je za iskanje po prvem kriteriju, tj. ClassName = 'sel', ugotovil dva elementa, ki izpolnjujeta pogoj, in prinesel 'Osnove' in 'Knjigo naročil'.
Nato se je premaknil na naslednja merila @FindBy in na xpath, podan za drugi @FindBy, je lahko prinesel element 'Fundamentals'. Zato je končno opredelil 3 elemente.
Tako ne dobi elementov, ki izpolnjujejo nobenega od pogojev @FindBy, ampak ločeno obravnava vsakega od @FindBy in prav tako identificira elemente. Poleg tega smo v trenutnem primeru tudi videli, da ne spremlja, ali so elementi enolični ( Npr. Element »Osnove« v tem primeru, ki je bil dvakrat prikazan kot del rezultata dveh meril @FindBy)
# 3) Tu obdelujemo delovanje pripisa @FindBys, ki se bo nanašal na seznam spletnih elementov z imenom findbysvalue. Tudi tu prva merila @FindBy iščejo elemente z className = 'sel', druga merila @FindBy pa iščejo določen element z xpath = “// a [@ id =” tab5 ”).
Zdaj, ko vemo, so elementi, opredeljeni za prvi pogoj @FindBy, 'Osnove' in 'Knjiga naročil', drugi kriterij @FindBy pa je 'Osnove'.
Torej, kako se bo rezultat @FindBys razlikoval od @FindAll? V prejšnjem poglavju smo izvedeli, da je @FindBys enakovreden pogojnemu operatorju AND in zato išče element ali seznam elementov, ki izpolnjuje vse pogoje @FindBy.
V skladu z našim trenutnim primerom je vrednost 'Osnove' edini element, ki ima class = 'sel' in id = 'tab5', s čimer izpolnjuje oba pogoja. To je razlog, zakaj je velikost @FindBys v testnem kovčku 1 in prikazuje vrednost kot 'Osnove'.
Predpomnjenje elementov v Pagefactory
Vsakič, ko se stran naloži, se vsi elementi na strani znova poiščejo s klicem prek @FindBy ali driver.findElement () in na strani je novo iskanje elementov.
Večino časa, ko so elementi dinamični ali se med izvajanjem spreminjajo, zlasti če gre za elemente AJAX, je vsekakor smiselno, da se ob vsakem nalaganju strani na novo poišče vse elemente na strani.
Če ima spletna stran statične elemente, lahko predpomnjenje elementa pomaga na več načinov. Ko so elementi predpomnjeni, jim ni treba znova poiskati elementov ob nalaganju strani, temveč se lahko sklicuje na skladišče predpomnjenih elementov. To prihrani veliko časa in dvigne boljše rezultate.
Pagefactory ponuja to funkcijo predpomnjenja elementov s pomočjo pripisa @CacheLookUp .
Pripis gonilniku pove, naj za elemente uporablja isti primerek lokatorja iz DOM-a in naj jih ne išče znova, medtem ko metoda initElements Pagefactory vidno prispeva k shranjevanju predpomnjenega statičnega elementa. InitElements opravijo predpomnjenje elementov.
Zaradi tega je koncept Pagefactory poseben v primerjavi z običajnim vzorcem oblikovanja strani. Prihaja z lastnimi prednostmi in slabostmi, o katerih bomo razpravljali malo kasneje. Na primer, gumb za prijavo na domači strani Facebook je statični element, ki ga je mogoče predpomniti in je idealen element za predpomnjenje.
Oglejmo si zdaj, kako implementirati pripis @CacheLookUp
Najprej morate uvoziti paket za Cachelookup, kot je prikazano spodaj:
import org.openqa.selenium.support.CacheLookup
Spodaj je delček, ki prikazuje definicijo elementa z @CacheLookUp. Takoj, ko prvič poiščete UniqueElement, initElement () shrani predpomnjeno različico elementa, tako da se naslednjič voznik namesto tega ne poišče elementa, ki se sklicuje na isti predpomnilnik in izvede dejanje na elementu desno stran.
@FindBy(id = 'unique') @CacheLookup private WebElement UniqueElement;
Oglejmo si skozi dejanski program, kako so dejanja na predpomnjenem spletnem elementu hitrejša od tistih na predpomnjenem spletnem elementu:
Za nadaljnje izboljšanje programa nseindia.com sem napisal še eno novo metodo monitorPerformance (), v kateri ustvarim predpomnjeni element za iskalno polje in nepredpomnjeni element za isto iskalno polje.
Nato poskusim 3000-krat dobiti ime oznake elementa tako za predpomnjeni kot za predpomnjeni element in poskušam izmeriti čas, potreben za dokončanje naloge tako predpomnjenega kot predpomnjenega elementa.
Premislil sem 3000-krat, tako da lahko vidimo vidno razliko v časovnem razporedu obeh. Pričakoval bom, da bo predpomnjeni element dobil ime oznake 3000 krat v krajšem času v primerjavi z nepredpomnjenim elementom.
Zdaj vemo, zakaj bi moral predpomnjeni element delovati hitreje, tj. Vozniku je naročeno, naj elementa ne išče po prvem iskanju, ampak neposredno nadaljuje z delom, kar pa ne velja za predpomnjeni element, pri katerem je iskanje elementov opravljeno za vseh 3000-krat in nato se na njem izvede dejanje.
Spodaj je koda za metodo 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 izvedbi bomo v oknu konzole videli spodnji rezultat:
Kot rezultat je naloga na predpomnjenem elementu končana leta 82 sekund, medtem ko je bil čas, potreben za dokončanje naloge v predpomnjenem elementu, le 37 sekund. To je resnično vidna razlika v odzivnem času tako predpomnjenega kot tudi predpomnjenega elementa.
V # 7) Kakšne so prednosti in slabosti pripisa @CacheLookUp v konceptu Pagefactory?
Odgovor:
Pros @CacheLookUp in situacije, ki so izvedljive za njegovo uporabo:
@CacheLookUp je izvedljiv, kadar so elementi statični ali se med nalaganjem strani sploh ne spremenijo. Takšni elementi ne spreminjajo časa delovanja. V takih primerih je priporočljivo, da s pripisom izboljšate splošno hitrost izvedbe testa.
Proti pripisu @CacheLookUp:
Največja slabost predpomnjenja elementov s pripisom je strah pred pogostim pridobivanjem StaleElementReferenceExceptions.
Dinamični elementi se pogosto osvežujejo s tistimi, ki se lahko hitro spremenijo v nekaj sekundah ali minutah časovnega intervala.
Spodaj je nekaj takšnih primerov dinamičnih elementov:
- Imate štoparico na spletni strani, ki sproti posodablja časovnik vsako sekundo.
- Okvir, ki nenehno posodablja vremensko poročilo.
- Stran, ki poroča o posodobitvah Sensexa v živo.
Ti sploh niso idealni ali izvedljivi za uporabo pripisa @CacheLookUp. V tem primeru tvegate, da boste dobili izjemo StaleElementReferenceExceptions.
Pri predpomnjenju takih elementov se med izvajanjem preizkusa spremeni DOM elementov, vendar voznik išče različico DOM, ki je bila že shranjena med predpomnjenjem. Zaradi tega zastareli element poišče gonilnik, ki ne obstaja več na spletni strani. To je razlog, zakaj je vržen StaleElementReferenceException.
Tovarniški razredi:
Pagefactory je koncept, ki temelji na več tovarniških razredih in vmesnikih. V tem poglavju bomo spoznali nekaj tovarniških razredov in vmesnikov. Nekaj, ki si jih bomo ogledali, so AjaxElementLocatorFactory , ElementLocatorFactory in DefaultElementFactory.
Ali smo se kdaj vprašali, ali Pagefactory na kakršen koli način vključuje implicitno ali eksplicitno čakanje na element, dokler ni izpolnjen določen pogoj ( Primer: Dokler element ni viden, omogočen, klikljiv itd.)? Če je odgovor pritrdilen, je tukaj ustrezen odgovor nanj.
AjaxElementLocatorFactory je eden pomembnih sodelavcev med vsemi tovarniškimi razredi. Prednost AjaxElementLocatorFactory je, da lahko razredu strani predmeta dodelite vrednost časovne omejitve za spletni element.
Čeprav Pagefactory ne ponuja izrecne funkcije čakanja, obstaja različica implicitnega čakanja z uporabo razreda AjaxElementLocatorFactory . Ta razred je mogoče uporabiti, če aplikacija uporablja komponente in elemente Ajax.
Tukaj je opisano, kako ga izvajate v kodi. V konstruktorju lahko, ko uporabimo metodo initElements (), uporabimo AjaxElementLocatorFactory za implicitno čakanje na elemente.
PageFactory.initElements(driver, this); can be replaced with PageFactory.initElements( new AjaxElementLocatorFactory(driver, 20), this);
Zgornja druga vrstica kode pomeni, da mora voznik nastaviti časovno omejitev 20 sekund za vse elemente na strani, ko se vsaka od njegovih obremenitev in če po 20 sekundah čakanja ni mogoče najti nobenega elementa, vrže „NoSuchElementException“. za ta manjkajoči element.
Čakanje lahko določite tudi spodaj:
public pageFactoryClass(WebDriver driver) { ElementLocatorFactory locateMe = new AjaxElementLocatorFactory(driver, 30); PageFactory.initElements(locateMe, this); this.driver = driver; }
Zgornja koda deluje popolnoma, ker razred AjaxElementLocatorFactory izvaja vmesnik ElementLocatorFactory.
Tu se nadrejeni vmesnik (ElementLocatorFactory) nanaša na objekt podrejenega razreda (AjaxElementLocatorFactory). Zato se med dodeljevanjem časovne omejitve z uporabo AjaxElementLocatorFactory uporablja Java-koncept 'nadgradnje' ali 'polimorfizma med izvajanjem'.
Glede na to, kako deluje tehnično, AjaxElementLocatorFactory najprej ustvari AjaxElementLocator z uporabo SlowLoadableComponent, ki morda ni končal nalaganja, ko se load () vrne. Po klicu load () mora metoda isLoaded () še naprej odpovedovati, dokler se komponenta ne naloži v celoti.
Z drugimi besedami, vsi elementi se bodo sveže iskali vsakič, ko bo element dostopen v kodi, tako da bo poklical klic locator.findElement () iz razreda AjaxElementLocator, ki bo nato uporabil časovno omejitev do nalaganja prek razreda SlowLoadableComponent.
Poleg tega po dodelitvi časovne omejitve prek AjaxElementLocatorFactory elementi z oznako @CacheLookUp ne bodo več predpomnjeni, saj bo pripis prezrt.
Obstaja tudi različica tega, kako ti lahko pokličite initElements () metoda in kako vi ne bi smel pokličite AjaxElementLocatorFactory dodeliti časovno omejitev elementu.
# 1) Namesto gonilniškega objekta lahko podate tudi ime elementa, kot je prikazano spodaj v metodi initElements ():
PageFactory.initElements( , this);
metoda initElements () v zgornji različici interno prikliče klic razreda DefaultElementFactory, konstruktor DefaultElementFactory pa kot vhodni parameter sprejme objekt vmesnika SearchContext. Objekt spletnega gonilnika in spletni element pripadata vmesniku SearchContext.
V tem primeru se bo metoda initElements () vnaprej inicializirala samo na omenjeni element in vsi elementi na spletni strani ne bodo inicializirani.
#two) Vendar je tu zanimiv preobrat tega dejstva, ki navaja, kako ne bi smeli klicati predmeta AjaxElementLocatorFactory na določen način. Če uporabim zgornjo različico initElements () skupaj z AjaxElementLocatorFactory, potem ne bo uspelo.
Primer: Spodnja koda, tj. Posredovanje imena elementa namesto objekta gonilnika definiciji AjaxElementLocatorFactory ne bo delovalo, saj konstruktor za razred AjaxElementLocatorFactory kot vhodni parameter vzame samo objekt spletnega gonilnika, zato objekt SearchContext s spletnim elementom zanj ne deluje.
PageFactory.initElements(new AjaxElementLocatorFactory(, 10), this);
V # 8) Ali je uporaba pagefactory izvedljiva možnost v primerjavi z običajnim vzorcem oblikovanja predmetov strani?
Odgovor: To je najpomembnejše vprašanje, ki ga imajo ljudje, in zato sem ga pomislil na koncu vaje. Zdaj poznamo »vhod in izhod« o Pagefactoryju, začenši z njenimi koncepti, uporabljenimi pripisi, dodatnimi funkcijami, ki jih podpira, izvajanjem s kodo, prednostmi in slabostmi.
Kljub temu ostajamo pri bistvenem vprašanju, da če ima pagefactory toliko dobrih stvari, zakaj se ne bi držali njegove uporabe.
Pagefactory ima koncept CacheLookUp, za katerega smo ugotovili, da ni izvedljiv za dinamične elemente, kot so vrednosti elementa, ki se pogosto posodablja. Torej, pagefactory brez CacheLookUp, ali je dobra možnost iti? Da, če so poti x statične.
Padec pa je v tem, da je sodobna doba napolnjena s težkimi dinamičnimi elementi, pri čemer vemo, da oblikovanje strani brez strani pagefactory deluje na koncu dobro, vendar koncept pagefactory enako dobro deluje z dinamičnimi potmi xpaths? Morda pa tudi ne. Tu je hiter primer:
Na spletni strani nseindia.com vidimo spodnjo tabelo.
Xpath tabele je
'//*[@id='tab9Content']/table/tbody/tr[+count+]/td[1]'
V vsaki vrstici za prvi stolpec 'Kupi količino' želimo pridobiti vrednosti. Da bi to naredili, bomo morali povečati števec vrstic, indeks stolpca pa ostane 1. Nikakor ne moremo prenesti tega dinamičnega XPath v pripisu @FindBy, saj pripisuje vrednosti, ki so statične in nobene spremenljivke ni mogoče prenesti naprej to.
Tukaj pagefactory v celoti odpove, medtem ko običajni POM odlično deluje. Z zanko for lahko enostavno povečate indeks vrstic s takšnimi dinamičnimi potmi xp v metodi driver.findElement ().
Zaključek
Page Object Model je oblikovni koncept ali vzorec, ki se uporablja v okviru avtomatizacije Selenium.
Imenovanje konvekcije metod je v objektnem modelu strani uporabniku prijazno. Kodo v POM-u je enostavno razumeti, ponovno uporabiti in vzdrževati. Če je v POM-u kakršna koli sprememba spletnega elementa, je dovolj, da spremembe spremenite v svojem razredu, namesto da urejate vse razrede.
Pagefactory, tako kot običajni POM, je čudovit koncept za uporabo. Vendar moramo vedeti, kje je običajni POM izvedljiv in kje Pagefactory dobro ustreza. V statičnih aplikacijah (kjer sta XPath in elementi statični) je mogoče Pagefactory prosto uporabiti z dodatnimi prednostmi boljšega delovanja.
Kadar aplikacija vključuje tako dinamične kot statične elemente, imate morda mešano izvedbo pom z Pagefactory in tisto brez Pagefactory, kot je izvedljivo za vsak spletni element.
Avtor: To vadnico je napisal Shobha D. Deluje kot vodja projekta in ima 9+ let izkušenj na področju ročnega upravljanja, avtomatizacije (Selenium, IBM Rational Functional Tester, Java) in testiranja API-jev (SOAPUI in Bodite prepričani v Java) .
Zdaj pa k vam za nadaljnjo implementacijo Pagefactory.
Srečno raziskovanje !!!
=> Obiščite tukaj, če se želite naučiti selena iz prask.
Priporočeno branje
- 30+ najboljših vaj za selen: Naučite se selen z resničnimi primeri
- Učinkoviti scenariji za skriptiranje in odpravljanje težav s selenijem - Vadnica za selenij št. 27
- Odpravljanje napak v skriptih selena z dnevniki (Vadnica za Log4j) - Vadnica za selen # 26
- Uvod v JUnit Framework in njegovo uporabo v skriptu selena - Vadnica za selen # 11
- 7 dejavnikov, ki vplivajo na preskusno oceno projekta za avtomatizacijo selena - vadnica za selen št. 32
- Trditve v selenu z uporabo okvirov Junit in TestNG
- Kako uporabiti ogrodje TestNG za ustvarjanje skriptov za selen - Vadnica # 12 za TestNG Selenium
- Naučite se uporabljati pripombe TestNG v selenu (s primeri)