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.

  • Concept de bază: Fiecare pagină a aplicației corespunde unei clase de pagină dedicate, care conține atât WebElements, cât și acțiunile efectuate asupra acestora, permițând o separare clară între structura UI și logica de testare.
  • Focus de implementare: POM promovează gestionarea elementelor reutilizabile și centralizate - modificările aduse elementelor paginii necesită actualizări într-o singură clasă în loc de scripturi multiple.
  • Avantaj de design: Modelul asigură depozite de obiecte mai curate, modulare și independente de instrumente, care se pot integra cu framework-uri precum TestNG, JUnit, Cucumber, sau JBehave.
  • Convenția de denumire: Metodele din cadrul claselor de pagini trebuie să reflecte acțiunile reale ale interfeței utilizator (de exemplu, gotoHomePage()), consolidând claritatea semantică în fluxurile de lucru de automatizare.
  • Structură îmbunătățită: Page Factory rafinează POM folosind @FindBy adnotări și PageFactory.initElements() pentru inițializarea automată a WebElement, eliminând repetitivitatea findElement apeluri.
  • Optimizarea performanței: AjaxElementLocatorFactory introduce încărcarea lentă — elementele sunt localizate doar atunci când sunt accesate — îmbunătățind eficiența execuției și gestionând cu grație comportamentul dinamic al paginii.
  • Rezultat: Abordarea unificată are ca rezultat o arhitectură de automatizare a testelor ușor de întreținut, lizibil și scalabilă, aliniată cu tehnologiile moderne. Selenium practici.

Model de obiect de pagină

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.

Model de obiect de pagină

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.

Model de obiect de pagină

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.

 Model de obiect de pagină

👉 Înscrie-te pentru Live Gratuit Selenium Proiect

Avantajele POM

  1. 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.
  2. 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.
  3. Code devine mai puțin important și optimizat deoarece reutilizează metodele de pagină din clasele POM.
  4. 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.

Implementați POM

Exemplu complet

TestCase: Accesează Guru99 Site demonstrativ.

Pasul 1) Accesați Guru99 Site demo

Implementați POM

Pasul 2) Pe pagina principală, verificați dacă textul „Guru„99 Bank” este prezent

Implementați POM

Pasul 3) Conectați-vă la aplicație

Implementați POM

Pasul 4) Verificați dacă pagina de pornire conține text ca „Manger Id: demo”

Implementați POM

În acest exemplu, avem de-a face cu două pagini:

  1. Autentificare Pagina
  2. 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.

Pagina Factory In Selenium

@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ă:

Fabrica de pagini în Selenium

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”.

Fabrica de localizare a elementelor Ajax

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

Întrebări frecvente

Modelul de obiecte al paginii este un model de design care absoarbetracelementele paginii web ts în clase separate. Simplifică automatizarea prin separarea interacțiunilor UI de logica de testare, promovând claritatea, scalabilitatea și reducând duplicarea codului.

In SeleniumPOM reprezintă fiecare pagină web ca o clasă dedicată care conține localizatori și acțiuni. Acesta încapsulează elemente ale interfeței utilizator, permițând scripturilor de testare să rămână independente de modificările structurii paginii subiacente.

POM nu este un framework independent, ci un model de design. Poate fi integrat în orice framework de automatizare pentru a structura testele eficient, asigurând o mai bună organizare, reutilizare și mentenabilitate.

POM este un principiu de design în care fiecare pagină web este modelată ca o clasă cu locatori și metode definite. Acesta decuplează logica de testare de elementele UI, îmbunătățind lizibilitatea, scalabilitatea și întreținerea pe termen lung.

POM definește structura de design pentru abs-ul paginiitracție, în timp ce Page Factory oferă adnotări și metode (@FindBy) pentru inițializarea eficientă a elementelor web. Page Factory este o îmbunătățire a implementării POM.

POM centralizează localizatoarele de elemente și acțiunile paginii în cadrul unor clase dedicate. Orice modificare a interfeței utilizator necesită actualizări într-un singur loc, reducând la minimum reluarea lucrărilor, îmbunătățind reutilizarea codului și accelerând mentenanța testelor.

Da. Generatoarele de teste bazate pe inteligență artificială pot crea automat clase POM prin analizarea ierarhiilor interfeței utilizator, menținând o separare logică a problemelor și accelerând în același timp crearea de teste complete.

POM promovează componente de testare modulare și reutilizabile, permițând integrarea cu instrumente de mentenanță a testelor bazate pe inteligență artificială care actualizează automat locatoarele, reducând fragilitatea scripturilor și cheltuielile generale de mentenanță.

Rezumați această postare cu: