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











