Stranica Object Model & Factory in Selenium
โก Pametni saลพetak
Objektni model stranice i tvornica stranica u Selenium definirati strukturirani obrazac dizajna za izgradnju robusnih, odrลพivih okvira za automatizaciju testiranja. Naglaลกava stvaranje klasa specifiฤnih za stranicu koje obuhvaฤaju WebElemente i njihova ponaลกanja, ฤime se smanjuje dupliciranje i poboljลกava ฤitljivost i skalabilnost Selenium testne skripte.

ล to je model objekta stranice? Koje su njegove kljuฤne komponente?
Model objekta stranice (POM) je dizajnerski obrazac, popularno koriลกten u automatizaciji testiranja, koji stvara spremiลกte objekata za elemente web korisniฤkog suฤelja. Prednost modela je ลกto smanjuje dupliciranje koda i poboljลกava odrลพavanje testiranja.
Prema ovom modelu, za svaku web stranicu u aplikaciji trebala bi postojati odgovarajuฤa klasa stranice. Ova klasa stranice identificirat ฤe web elemente te web stranice i takoฤer sadrลพi metode stranice koje izvrลกavaju operacije na tim web elementima. Imena tih metoda trebaju biti dana prema zadatku koji izvrลกavaju, tj. ako program za uฤitavanje ฤeka da se pojavi platni sustav, naziv POM metode moลพe biti waitForPaymentScreenDisplay().
Kljuฤne komponente modela objekta stranice
- Klase stranica: Predstavite svaku web stranicu kao zasebnu klasu.
- Lokatori: Identificirajte web elemente pomoฤu ID-ova, XPath-ova ili CSS selektora.
- Metode: Sadrลพe radnje ili operacije izvrลกene na .page elementima.
- Ponovno koriลกtenje: Promoponovna upotreba tes koda i lakลกe odrลพavanje kroz testove.
- Odvajanje koncerna: Odrลพava strukturu stranice neovisnom od testne logike radi bolje organizacije.
Zaลกto Page Object Model?
Pokretanje automatizacije korisniฤkog suฤelja u Selenium webdriver NIJE teลพak zadatak. Samo trebate pronaฤi elemente i izvrลกiti operacije na njima.
Razmotrite ovaj jednostavan skript za prijavu na web stranicu.
Kao ลกto vidite, sve ลกto radimo je pronalaลพenje elemenata i ispunjavanje vrijednosti za te elemente.
Ovo je dugotrajan skript, sklon greลกkama. U poฤetku se ฤini jednostavnim, ali kako se skup testova ลกiri, upravljanje promjenama elemenata postaje teลกko. Ali s vremenom ฤe se skup testova poveฤavati. Kako dodajete sve viลกe i viลกe redaka u svoj kod, stvari postaju teลพe.
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 skripti je stvaranje zasebne datoteke klase koja bi pronalazila web elemente, ispunjavala ih ili provjeravala. Ova se klasa zatim moลพe ponovno koristiti u viลกe testnih skripti koje komuniciraju s istim elementom. U buduฤnosti, ako doฤe do promjene u web elementu, moramo napraviti promjenu u samo jednoj datoteci klase, a ne u 10 razliฤitih skripti.
Ovaj pristup se naziva Page Object Model in SeleniumPomaลพe u ฤitljivosti, odrลพavanju i ponovnoj upotrebi koda.
๐ Prijavite se za besplatni prijenos uลพivo Selenium Projekt
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 objektni repozitorij neovisan o testnim sluฤajevima, tako da isti objektni repozitorij moลพemo koristiti za razliฤite svrhe s razliฤitim alatima. Na primjer, moลพemo integrirati Page Object Model u Selenium sa TestNG/JUnit za funkcionalne Ispitivanje i u isto vrijeme s JBehave/Cucumber za ispitivanje prihvatljivosti.
- Code postaje manji i optimiziran jer ponovno koristi metode stranice u POM klasama.
- Metode dobivaju realistiฤnija imena koja se mogu lako mapirati na operaciju koja se dogaฤa u korisniฤkom suฤelju. tj. ako nakon klika na gumb doฤemo na poฤetnu stranicu, naziv metode bit ฤe poput 'gotoHomePage()'.
Kako implementirati POM u Selenium?
Jednostavni PLog u temeljnoj strukturi okvira modela objekta stranice, gdje su whereManagerElements od Austrije i metode koje rade na tim web elementima odrลพavaju se unutar clog datoteke. Zadatak poput verifikacije trebao bi biti odvojen kao dio testnih metoda.
Kompletan primjer
Testni sluฤaj: Idi na Guru99 Demo stranica.
Korak 1) Idite na Guru99 Demo stranica
Korak 2) Na poฤetnoj stranici provjerite je li tekst โGuru99 Bankโ je prisutna
Korak 3) Prijavite se u aplikaciju
Korak 4) Provjerite sadrลพi li poฤetna stranica tekst kao "ID upravitelja: demo"
U ovom primjeru imamo posla s dvije 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 the 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 allows the test case to perform the login operation
* @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 u 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 Jednostavni POM u 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("https://demo.guru99.com/V4/");
}
/**
* This test case will login in https://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("manager id : mgr123"));
}
U ฤemu je Page Factory Selenium?
Tvornica stranica u Selenium je ugraฤeni okvirni koncept Page Object Model za Selenium WebDriver koji poboljลกava odrลพavanje smanjenjem ponavljajuฤih pretraga elemenata pomoฤu anotacija, a ne brzinom izvrลกavanja. Koristi se za inicijalizaciju objekata stranice ili za instanciranje samog objekta stranice. 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 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 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();
}
}
Guru99 Poฤetna stranica 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("https://demo.guru99.com/V4/");
}
/**
* This test go to https://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("manager id : mgr123"));
}
}
Potpuna struktura projekta izgledat ฤe kao dijagram:
AjaxElementLocatorFactory
AjaxElementLocatorFactory je koncept lijenog uฤitavanja PageFactory u SeleniumKoristi 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 operacija izvrลกi na elementu, ฤekanje na njegovu vidljivost poฤinje tek od tog trenutka. Ako element nije pronaฤen u zadanom vremenskom intervalu, Testni sluฤaj izvrลกenje ฤe izbaciti iznimku 'NoSuchElementException'.
Na primjer:
AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10); PageFactory.initElements(factory, this);
Preuzimanje Selenium Projektne datoteke za demo u ovom vodiฤu











