Page Object Model (POM) i Page Factory in Selenium
Što je Page Object Model?
Model objekta stranice (POM) je obrazac dizajna, popularno korišten u automatizaciji testiranja koji stvara Object Repository za elemente web sučelja. Prednost modela je što smanjuje dupliciranje koda i poboljšava održavanje testa.
Prema ovom modelu, za svaku web stranicu u aplikaciji trebala bi postojati odgovarajuća klasa stranice. Ova klasa stranice identificirat će WebElemente te web stranice i također sadrži metode stranice koje izvode operacije na tim WebElementima. Naziv ovih metoda treba dati prema zadatku koji obavljaju, tj. ako učitavač čeka da se pojavi pristupnik plaćanja, naziv POM metode može biti waitForPaymentScreenDisplay().
Zašto Page Object Model?
Pokretanje automatizacije korisničkog sučelja u Selenium WebDriver NIJE težak zadatak. Vi samo trebate pronaći elemente, izvršiti operacije na njima.
Razmotrite ovu jednostavnu skriptu za prijavu na web mjesto
Kao što vidite, sve što radimo je pronalaženje elemenata i ispunjavanje vrijednosti za te elemente.
Ovo je mala skripta. Održavanje skripte izgleda jednostavno. Ali s vremenom će testni paket rasti. Kako svom kodu dodajete sve više redaka, stvari postaju teške.
Glavni problem s održavanjem skripte je da ako 10 različitih skripti koristi isti element stranice, uz bilo kakvu promjenu u tom elementu, trebate promijeniti svih 10 skripti. Ovo oduzima puno vremena i podložno je greškama.
Bolji pristup održavanju skripte je kreiranje zasebne datoteke klase koja bi pronašla web elemente, ispunila ih ili provjerila. Ova se klasa može ponovno koristiti u svim skriptama koje koriste taj element. Ubuduće, ako dođe do promjene u web elementu, moramo izvršiti promjenu u samo 1 class datoteci, a ne u 10 različitih skripti.
Ovaj pristup se naziva Page Object Model in Selenium. Pomaže kod učiniti čitljivijim, održavanijim i višekratnim.
Prednosti POM-a
- Page Object Design Pattern kaže da operacije i tokovi u korisničkom sučelju trebaju biti odvojeni od verifikacije. Ovaj koncept čini naš kod čišćim i lakšim za razumijevanje.
- Druga prednost je što je repozitorij objekata neovisan o testnim slučajevima, tako da možemo koristiti isti repozitorij objekata za različite svrhe s različitim alatima. Na primjer, možemo integrirati Page Object Model Selenium s TestNG/JUnit za funkcionalne Ispitivanje i u isto vrijeme s JBehave/Cucumber za ispitivanje prihvatljivosti.
- Kod postaje manje i optimiziran zbog metoda stranica koje se mogu ponovno koristiti u POM klasama.
- Metode dobivaju realističnija imena koja se mogu lako mapirati s operacijom koja se odvija u korisničkom sučelju. tj. ako nakon klika na gumb dođemo na početnu stranicu, naziv metode će biti poput 'gotoHomePage()'.
Kako implementirati POM?
Jednostavan POM:
To je osnovna struktura okvira modela objektnih stranica u kojoj su svi Web elementi Austrije a metode koje rade na ovim web elementima održavaju se unutar datoteke klase. Zadatak poput verifikacije trebao bi biti odvojen kao dio testnih metoda.
Kompletan primjer
Testni slučaj: Idite na demo stranicu Guru99.
Korak 1) Idite na demo stranicu Guru99
Korak 2) Na početnoj stranici provjerite postoji li tekst "Guru99 Bank".
Korak 3) Prijavite se u aplikaciju
Korak 4) Provjerite sadrži li početna stranica tekst kao "ID upravitelja: demo"
Ovdje se radi o 2 stranice
- Prijavite stranicu
- Početna stranica (prikazuje se kada se prijavite)
U skladu s tim, stvaramo 2 POM in Selenium Nastava
Guru99 Stranica za prijavu POM
package pages; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class Guru99Login { WebDriver driver; By user99GuruName = By.name("uid"); By password99Guru = By.name("password"); By titleText =By.className("barone"); By login = By.name("btnLogin"); public Guru99Login(WebDriver driver){ this.driver = driver; } //Set user name in textbox public void setUserName(String strUserName){ driver.findElement(user99GuruName).sendKeys(strUserName); } //Set password in password textbox public void setPassword(String strPassword){ driver.findElement(password99Guru).sendKeys(strPassword); } //Click on login button public void clickLogin(){ driver.findElement(login).click(); } //Get the title of Login Page public String getLoginTitle(){ return driver.findElement(titleText).getText(); } /** * This POM method will be exposed in test case to login in the application * @param strUserName * @param strPasword * @return */ public void loginToGuru99(String strUserName,String strPasword){ //Fill user name this.setUserName(strUserName); //Fill password this.setPassword(strPasword); //Click Login button this.clickLogin(); } }
Guru99 Početna stranica POM in Selenium
package pages; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class Guru99HomePage { WebDriver driver; By homePageUserName = By.xpath("//table//tr[@class='heading3']"); public Guru99HomePage(WebDriver driver){ this.driver = driver; } //Get the User name from Home Page public String getHomePageDashboardUserName(){ return driver.findElement(homePageUserName).getText(); } }
Guru99 Jednostavan POM in Selenium Testni slučaj
package test; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.Assert; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import pages.Guru99HomePage; import pages.Guru99Login; public class Test99GuruLogin { String driverPath = "C:\\geckodriver.exe"; WebDriver driver; Guru99Login objLogin; Guru99HomePage objHomePage; @BeforeTest public void setup(){ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("http://demo.guru99.com/V4/"); } /** * This test case will login in http://demo.guru99.com/V4/ * Verify login page title as guru99 bank * Login to application * Verify the home page using Dashboard message */ @Test(priority=0) public void test_Home_Page_Appear_Correct(){ //Create Login Page object objLogin = new Guru99Login(driver); //Verify login page title String loginPageTitle = objLogin.getLoginTitle(); Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank")); //login to application objLogin.loginToGuru99("mgr123", "mgr!23"); // go the next page objHomePage = new Guru99HomePage(driver); //Verify home page Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manger id : mgr123")); }
U čemu je Page Factory Selenium?
Tvornica stranica u Selenium je ugrađeni okvirni koncept Page Object Model za Selenium WebDriver, ali je vrlo optimiziran. Koristi se za inicijalizaciju Page objekata ili za instanciranje samog Page objekta. Također se koristi za inicijalizaciju elemenata klase stranice bez korištenja "FindElement/s."
Ovdje također slijedimo koncept odvajanja Page Object Repository i Test Methods. Dodatno, uz pomoć klase PageFactory in Selenium, koristimo bilješke @FindBy pronaći WebElement. Koristimo metodu initElements za inicijalizaciju web elemenata
@FindBy može prihvatiti tagName, partialLinkText, name, linkText, id, css, className, xpath kao atributi.
Pogledajmo isti primjer kao i gore koristeći Page Factory
Guru99 Stranica za prijavu s Page Factory
package PageFactory; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class Guru99Login { /** * All WebElements are identified by @FindBy annotation */ WebDriver driver; @FindBy(name="uid") WebElement user99GuruName; @FindBy(name="password") WebElement password99Guru; @FindBy(className="barone") WebElement titleText; @FindBy(name="btnLogin") WebElement login; public Guru99Login(WebDriver driver){ this.driver = driver; //This initElements method will create all WebElements PageFactory.initElements(driver, this); } //Set user name in textbox public void setUserName(String strUserName){ user99GuruName.sendKeys(strUserName); } //Set password in password textbox public void setPassword(String strPassword){ password99Guru.sendKeys(strPassword); } //Click on login button public void clickLogin(){ login.click(); } //Get the title of Login Page public String getLoginTitle(){ return titleText.getText(); } /** * This POM method will be exposed in test case to login in the application * @param strUserName * @param strPasword * @return */ public void loginToGuru99(String strUserName,String strPasword){ //Fill user name this.setUserName(strUserName); //Fill password this.setPassword(strPasword); //Click Login button this.clickLogin(); } }
Početna stranica Guru99 s tvornicom stranica
package PageFactory; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class Guru99HomePage { WebDriver driver; @FindBy(xpath="//table//tr[@class='heading3']") WebElement homePageUserName; public Guru99HomePage(WebDriver driver){ this.driver = driver; //This initElements method will create all WebElements PageFactory.initElements(driver, this); } //Get the User name from Home Page public String getHomePageDashboardUserName(){ return homePageUserName.getText(); } }
Guru99 TestCase s konceptom Page Factory
package test; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.Assert; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import PageFactory.Guru99HomePage; import PageFactory.Guru99Login; public class Test99GuruLoginWithPageFactory { String driverPath = "C:\\geckodriver.exe"; WebDriver driver; Guru99Login objLogin; Guru99HomePage objHomePage; @BeforeTest public void setup(){ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("http://demo.guru99.com/V4/"); } /** * This test go to http://demo.guru99.com/V4/ * Verify login page title as guru99 bank * Login to application * Verify the home page using Dashboard message */ @Test(priority=0) public void test_Home_Page_Appear_Correct(){ //Create Login Page object objLogin = new Guru99Login(driver); //Verify login page title String loginPageTitle = objLogin.getLoginTitle(); Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank")); //login to application objLogin.loginToGuru99("mgr123", "mgr!23"); // go the next page objHomePage = new Guru99HomePage(driver); //Verify home page Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manger id : mgr123")); } }
Potpuna struktura projekta izgledat će kao dijagram:
AjaxElementLocatorFactory
AjaxElementLocatorFactory je koncept lijenog učitavanja PageFactory u Selenium. Koristi se za pronalaženje web elemenata samo kada se elementi koriste u bilo kojoj operaciji. Dodjeljuje vremensko ograničenje za WebElements klasi stranice objekta. Jedna od ključnih prednosti korištenja uzorka PageFactory u Selenium je klasa AjaxElementLocatorFactory.
Ovdje, kada se izvrši operacija na elementu, čekanje njegove vidljivosti počinje tek od tog trenutka. Ako element nije pronađen u zadanom vremenskom intervalu, Testni slučaj izvršenje će izbaciti iznimku 'NoSuchElementException'.
rezime
- Model objekta stranice u Selenium WebDriver je uzorak dizajna spremišta objekata.
- Selenium objektni model stranice stvara naš kod za testiranje koji se može održavati, ponovno koristiti.
- Page Factory je optimizirani način za stvaranje repozitorija objekata u okvirnom konceptu Page Object Model.
- AjaxElementLocatorFactory je koncept odlijepljenog učitavanja u Page Factory – obrazac dizajna objekta stranice za prepoznavanje WebElemenata samo kada se koriste u bilo kojoj operaciji.
Preuzimanje Selenium Projektne datoteke za demo u ovom vodiču