Pagina Obiect Model și Fabrică în Selenium
⚡ Rezumat inteligent
Modelul de obiecte de pagină și Fabrica de pagini în Selenium definește un model de design structurat pentru construirea unor cadre de automatizare a testelor robuste și ușor de întreținut. Acesta pune accent pe crearea de clase specifice paginii care încapsulează WebElements și comportamentele acestora, reducând astfel duplicarea și îmbunătățind lizibilitatea și scalabilitatea Selenium scripturi de testare.
Ce este Modelul de Obiecte al Paginii? Care sunt componentele sale cheie?
Modelul obiectului paginii (POM) este un model de design, utilizat popular în automatizarea testelor, care creează un depozit de obiecte pentru elementele interfeței web. Avantajul modelului este că reduce duplicarea codului și îmbunătățește întreținerea testelor.
Conform acestui model, pentru fiecare pagină web din aplicație, ar trebui să existe o clasă Page corespunzătoare. Această clasă Page va identifica WebElements-urile acelei pagini web și conține, de asemenea, metode Page care efectuează operațiuni asupra acelor WebElements. Numele acestor metode ar trebui să fie date în funcție de sarcina pe care o îndeplinesc, de exemplu, dacă un încărcător așteaptă apariția gateway-ului de plată, numele metodei POM poate fi waitForPaymentScreenDisplay().
Componente cheie ale modelului de obiecte al paginii
- Clase de pagini: Reprezentați fiecare pagină web ca o clasă separată.
- Localizatori: Identificați elementele web folosind ID-uri, XPath-uri sau selectori CSS.
- Metode: Conțin acțiuni sau operațiuni efectuate asupra elementelor .page.
- Reutilizabilitate: Promoreutilizarea codului tes și întreținere mai ușoară în timpul testelor.
- Separarea preocupărilor: Menține structura paginii independentă de logica de testare pentru o mai bună organizare.
De ce modelul obiectului paginii?
Pornirea unei automatizări a interfeței utilizator în Selenium webdriver NU este o sarcină dificilă. Trebuie doar să găsești elemente și să efectuezi operații asupra lor.
Luați în considerare acest script simplu pentru a vă conecta la un site web.
După cum puteți observa, tot ceea ce facem este să găsim elemente și să completăm valorile pentru acele elemente.
Acesta este un script care consumă mult timp și este predispus la erori. Pare ușor inițial, dar pe măsură ce suita de teste se extinde, gestionarea modificărilor elementelor devine dificilă. Dar, cu timpul, suita de teste va crește. Pe măsură ce adăugați tot mai multe linii în cod, lucrurile devin dificile.
Problema principală cu întreținerea scripturilor este că, dacă 10 scripturi diferite folosesc același element de pagină, cu orice modificare în acel element, trebuie să schimbați toate cele 10 scripturi. Acest lucru necesită timp și este predispus la erori.
O abordare mai bună pentru întreținerea scripturilor este crearea unui fișier de clasă separat care să găsească elementele web, să le completeze sau să le verifice. Această clasă poate fi apoi reutilizată în mai multe scripturi de testare care interacționează cu același element. În viitor, dacă există o modificare a elementului web, va trebui să facem modificarea într-un singur fișier de clasă și nu în 10 scripturi diferite.
Această abordare se numește Page Object Model în SeleniumAjută la creșterea lizibilității, întreținerii și reutilizării codului.
👉 Înscrie-te pentru Live Gratuit Selenium Proiect
Avantajele POM
- Modelul de proiectare a obiectelor de pagină spune că operațiunile și fluxurile din interfața de utilizare ar trebui separate de verificare. Acest concept face codul nostru mai curat și ușor de înțeles.
- Al doilea avantaj este că depozitul de obiecte este independent de cazurile de testare, astfel încât putem utiliza același depozit de obiecte pentru un scop diferit cu instrumente diferite. De exemplu, putem integra Modelul de Obiecte al Paginii în Selenium implementate cu TestNG/JUnit pentru funcțional Testarea si in acelasi timp cu JBehave/Cucumber pentru testarea de acceptare.
- Code devine mai puțin important și optimizat deoarece reutilizează metodele de pagină din clasele POM.
- Metodele primesc nume mai realiste, care pot fi ușor mapate la operațiunea care are loc în interfața cu utilizatorul. De exemplu, dacă după ce dăm clic pe buton ajungem pe pagina principală, numele metodei va fi de genul „gotoHomePage()”.
Cum se implementează POM în Selenium?
PLog simplu în structura fundamentală a unui framework Page Object Model, unde elementele whereManagereIDE ale AUT iar metodele care operează asupra acestor elemente web sunt menținute într-un fișier clog. O sarcină precum verificarea ar trebui să fie separată, ca parte a metodelor de testare.
Exemplu complet
TestCase: Accesează Guru99 Site demonstrativ.
Pasul 1) Accesați Guru99 Site demo
Pasul 2) Pe pagina principală, verificați dacă textul „Guru„99 Bank” este prezent
Pasul 3) Conectați-vă la aplicație
Pasul 4) Verificați dacă pagina de pornire conține text ca „Manger Id: demo”
În acest exemplu, avem de-a face cu două pagini:
- Autentificare Pagina
- Pagina de pornire (afișată odată ce v-ați autentificat)
În consecință, creăm 2 POM în Selenium clase
Guru99 Pagină de conectare 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 POM pentru pagina principală 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 POM simplu în Selenium Caz de testare
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"));
}
În ce se află Page Factory Selenium?
Fabrica de pagini în Selenium este un concept cadru de model de obiecte de pagină încorporat pentru Selenium Driver web care îmbunătățește mentenabilitatea prin reducerea căutărilor repetitive ale elementelor folosind adnotări, nu prin viteza de execuție. Este utilizat pentru inițializarea obiectelor Page sau pentru a instanția obiectul Page în sine. De asemenea, este utilizat pentru inițializarea elementelor clasei Page fără a utiliza „FindElement/s”.
Și aici, urmărim conceptul de separare a depozitului de obiecte de pagină și a metodelor de testare. În plus, cu ajutorul clasei PageFactory în Selenium, folosim adnotări @FindBy pentru a găsi WebElement. Folosim metoda initElements pentru a inițializa elementele web.
@FindBy poate accepta tagName, partialLinkText, nume, linkText, id, css, className, xpath ca atribute.
Să ne uităm la același exemplu ca mai sus folosind Page Factory
Guru99 Pagină de autentificare cu 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();
}
}
Guru99 Pagină principală cu 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 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 de cazuri de testare cu conceptul 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"));
}
}
Structura completă a proiectului va arăta ca în diagramă:
AjaxElementLocatorFactory
AjaxElementLocatorFactory este un concept de încărcare leneșă a PageFactory în SeleniumEste folosit pentru a găsi elementele web numai atunci când elementele sunt utilizate în orice operațiune. Atribuie un timeout pentru WebElements clasei de pagini obiect. Unul dintre avantajele cheie ale utilizării modelului PageFactory în Selenium este clasa AjaxElementLocatorFactory.
Aici, când se efectuează o operație asupra unui element, așteptarea vizibilității sale începe doar din acel moment. Dacă elementul nu este găsit în intervalul de timp dat, Caz de testare execuția va arunca excepția „NoSuchElementException”.
De exemplu:
AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10); PageFactory.initElements(factory, this);
Descărcați Selenium Fișiere de proiect pentru demonstrația din acest tutorial












