Modello di oggetti di pagina e fabbrica in Selenium

โšก Riepilogo intelligente

Modello di oggetti di pagina e fabbrica di pagine in Selenium Definire un modello di progettazione strutturato per la creazione di framework di automazione dei test robusti e manutenibili. Si concentra sulla creazione di classi specifiche per pagina che incapsulano WebElement e i loro comportamenti, riducendo cosรฌ le duplicazioni e migliorando la leggibilitร  e la scalabilitร  di Selenium script di prova.

  • Concetto principale: Ogni pagina dell'applicazione corrisponde a una classe di pagina dedicata contenente sia i WebElement sia le azioni eseguite su di essi, consentendo una netta separazione tra la struttura dell'interfaccia utente e la logica di test.
  • Focus sull'implementazione: POM promuove la gestione centralizzata e riutilizzabile degli elementi: le modifiche agli elementi della pagina richiedono aggiornamenti in una sola classe anzichรฉ in piรน script.
  • Vantaggio di progettazione: Il modello garantisce repository di oggetti piรน puliti, modulari e indipendenti dagli strumenti che possono integrarsi con framework come TestNG, JUnit, Cucumber, o JBehave.
  • Convenzione di denominazione: I metodi all'interno delle classi di pagina devono rispecchiare le azioni effettive dell'interfaccia utente (ad esempio, gotoHomePage()), rafforzando la chiarezza semantica nei flussi di lavoro di automazione.
  • Struttura migliorata: Page Factory perfeziona POM utilizzando @FindBy annotazioni e PageFactory.initElements() per l'inizializzazione automatica di WebElement, eliminando ripetitivi findElement chiamate.
  • Ottimizzazione delle prestazioni: AjaxElementLocatorFactory introduce il caricamento differito: gli elementi vengono individuati solo quando vi si accede, migliorando l'efficienza di esecuzione e gestendo con eleganza il comportamento dinamico delle pagine.
  • Risultato: L'approccio unificato si traduce in un'architettura di automazione dei test manutenibile, leggibile e scalabile, allineata con le moderne Selenium pratiche.

Modello a oggetti della pagina

Cos'รจ il Page Object Model? Quali sono i suoi componenti chiave?

Modello oggetto pagina (POM) รจ un design pattern, comunemente utilizzato nell'automazione dei test, che crea un repository di oggetti per gli elementi dell'interfaccia utente web. Il vantaggio del modello รจ che riduce la duplicazione del codice e migliora la manutenzione dei test.

In base a questo modello, per ogni pagina web dell'applicazione dovrebbe esserci una classe di pagina corrispondente. Questa classe di pagina identificherร  i WebElement di quella pagina web e conterrร  anche i metodi di pagina che eseguono operazioni su tali WebElement. I nomi di questi metodi dovrebbero essere assegnati in base all'attivitร  che stanno eseguendo, ad esempio, se un loader รจ in attesa della visualizzazione del gateway di pagamento, il nome del metodo POM puรฒ essere waitForPaymentScreenDisplay().

Componenti chiave del modello di oggetti di pagina

  • Classi di pagina: Rappresenta ogni pagina web come una classe separata.
  • Localizzatori: Identifica gli elementi web utilizzando ID, XPath o selettori CSS.
  • Metodi: Contengono azioni o operazioni eseguite sugli elementi .page.
  • Riusabilitร : Promoriutilizzo del codice TES e manutenzione piรน semplice nei test.
  • Separazione degli interessi: Mantiene la struttura della pagina indipendente dalla logica del test per una migliore organizzazione.

Modello a oggetti della pagina

Perchรฉ il modello a oggetti della pagina?

Avvio di un'automazione dell'interfaccia utente in Selenium webdriver NON รจ un compito difficile. Devi solo trovare gli elementi ed eseguire operazioni su di essi.

Prendiamo in considerazione questo semplice script per accedere a un sito web.

Modello a oggetti della pagina

Come puoi osservare, tutto ciรฒ che stiamo facendo รจ trovare elementi e riempire valori per tali elementi.

Si tratta di uno script che richiede molto tempo ed รจ soggetto a errori. Inizialmente sembra facile, ma man mano che la suite di test si espande, gestire le modifiche agli elementi diventa difficile. Col tempo, perรฒ, la suite di test crescerร . Aggiungendo sempre piรน righe al codice, le cose si faranno piรน complicate.

Il problema principale con la manutenzione degli script รจ che se 10 script diversi utilizzano lo stesso elemento della pagina, con qualsiasi modifica in quell'elemento, รจ necessario modificare tutti e 10 gli script. Ciรฒ richiede tempo ed รจ soggetto a errori.

Un approccio migliore alla manutenzione degli script consiste nel creare un file di classe separato che individui gli elementi web, li riempia o li verifichi. Questa classe puรฒ quindi essere riutilizzata in piรน script di test che interagiscono con lo stesso elemento. In futuro, se si verifica una modifica nell'elemento web, dovremo apportare la modifica in un solo file di classe e non in 10 script diversi.

Questo approccio รจ chiamato Page Object Model in SeleniumAiuta a rendere il codice piรน leggibile, manutenibile e riutilizzabile.

 Modello a oggetti della pagina

๐Ÿ‘‰ Iscriviti gratuitamente in diretta Selenium Progetto

Vantaggi del POM

  1. Page Object Design Pattern afferma che le operazioni e i flussi nell'interfaccia utente dovrebbero essere separati dalla verifica. Questo concetto rende il nostro codice piรน pulito e facile da capire.
  2. Il secondo vantaggio รจ che il repository degli oggetti รจ indipendente dai casi di test, quindi possiamo utilizzare lo stesso repository per scopi diversi con strumenti diversi. Ad esempio, possiamo integrare il Page Object Model in Selenium con TestNG/JUnit per funzionale Collaudo e allo stesso tempo con JBehave/Cucumber per le prove di accettazione.
  3. Code Diventa piรน leggero e ottimizzato grazie al riutilizzo dei metodi di pagina nelle classi POM.
  4. I metodi hanno nomi piรน realistici che possono essere facilmente mappati all'operazione che avviene nell'interfaccia utente. Ad esempio, se dopo aver cliccato sul pulsante atterriamo sulla home page, il nome del metodo sarร  simile a 'gotoHomePage()'.

Come implementare POM in Selenium?

PLog semplice nella struttura fondamentale di un framework Page Object Model, dove whereManagereIDElements del funzione AUT e i metodi che operano su questi elementi Web sono mantenuti all'interno di un file clog. Un'attivitร  come la verifica dovrebbe essere separata come parte dei metodi di test.

Implementare il POM

Esempio completo

Caso di prova: Vai su Guru99 Sito dimostrativo.

Passaggio 1) Vai a Guru99 Sito dimostrativo

Implementare il POM

Passaggio 2) Nella home page, verificare che il testo โ€œGuru99 Bankโ€ รจ presente

Implementare il POM

Passaggio 3) Accedi all'applicazione

Implementare il POM

Passaggio 4) Verifica che la home page contenga il testo "ID manager: demo"

Implementare il POM

In questo esempio abbiamo a che fare con due pagine:

  1. Pagina di login
  2. Home Page (mostrata una volta effettuato l'accesso)

Di conseguenza, creiamo 2 POM in Selenium classi

Guru99 Pagina di accesso 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 Pagina iniziale 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 POM semplici in Selenium Caso di prova

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"));
    }

In cosa consiste Page Factory Selenium?

Pagina Fabbrica in Selenium รจ un concetto di framework Page Object Model integrato per Selenium WebDriver che migliora la manutenibilitร  riducendo le ricerche ripetitive di elementi tramite annotazioni, non tramite la velocitร  di esecuzione. Viene utilizzato per l'inizializzazione degli oggetti Page o per istanziare l'oggetto Page stesso. Viene anche utilizzato per inizializzare gli elementi della classe Page senza utilizzare "FindElement/s".

Anche qui seguiamo il concetto di separazione tra Page Object Repository e Test Methods. Inoltre, con l'aiuto della classe PageFactory in Selenium, usiamo le annotazioni @FindBy per trovare WebElement. Utilizziamo il metodo initElements per inizializzare gli elementi web.

Pagina Fabbrica in Selenium

@FindBy puรฒ accettare tagName, partialLinkText, nome, linkText, id, css, className, xpath come attributi.

Diamo un'occhiata allo stesso esempio di cui sopra utilizzando Page Factory

Guru99 Pagina di accesso con 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 Pagina iniziale con 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 casi di test con concetto di 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"));
    }
}

La struttura completa del progetto sarร  simile al diagramma:

Pagina Fabbrica in Selenium

AjaxElementLocatorFactory

AjaxElementLocatorFactory รจ un concetto di caricamento lento di PageFactory in SeleniumViene utilizzato per trovare gli elementi web solo quando vengono utilizzati in un'operazione. Assegna un timeout per WebElements alla classe oggetto della pagina. Uno dei principali vantaggi dell'utilizzo del pattern PageFactory in Selenium รจ la classe AjaxElementLocatorFactory.

In questo caso, quando viene eseguita un'operazione su un elemento, l'attesa per la sua visibilitร  inizia solo da quel momento. Se l'elemento non viene trovato nell'intervallo di tempo specificato, Test Case l'esecuzione genererร  l'eccezione "NoSuchElementException".

Fabbrica di localizzazione di elementi Ajax

Per esempio:

AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10);
PageFactory.initElements(factory, this);

Scarica la Selenium File di progetto per la demo in questo tutorial

DOMANDE FREQUENTI

Il Page Object Model รจ un modello di progettazione che assorbetracQuesto approccio semplifica l'automazione separando le interazioni dell'interfaccia utente dalla logica di test, favorendo chiarezza, scalabilitร  e riducendo la duplicazione del codice.

In Selenium, POM rappresenta ogni pagina web come una classe dedicata contenente localizzatori e azioni. Incapsula gli elementi dell'interfaccia utente, consentendo agli script di test di rimanere indipendenti dalle modifiche alla struttura della pagina sottostante.

POM non รจ un framework autonomo, ma un design pattern. Puรฒ essere integrato in qualsiasi framework di automazione per strutturare i test in modo efficiente, garantendo una migliore organizzazione, riutilizzabilitร  e manutenibilitร .

POM รจ un principio di progettazione in cui ogni pagina web รจ modellata come una classe con localizzatori e metodi definiti. Separa la logica di test dagli elementi dell'interfaccia utente, migliorando la leggibilitร , la scalabilitร  e la manutenzione a lungo termine.

POM definisce la struttura di progettazione per l'abstract della paginatraczione, mentre Page Factory fornisce annotazioni e metodi (@FindBy) per inizializzare in modo efficiente gli elementi web. Page Factory รจ un miglioramento dell'implementazione di POM.

POM centralizza i localizzatori di elementi e le azioni di pagina all'interno di classi dedicate. Qualsiasi modifica all'interfaccia utente richiede aggiornamenti in un unico punto, riducendo al minimo le rilavorazioni, migliorando il riutilizzo del codice e accelerando la manutenzione dei test.

Sรฌ. I generatori di test basati sull'intelligenza artificiale possono creare automaticamente classi POM analizzando le gerarchie dell'interfaccia utente, mantenendo la separazione logica delle problematiche e accelerando al contempo la creazione di test end-to-end.

POM promuove componenti di test modulari e riutilizzabili, consentendo l'integrazione con strumenti di manutenzione dei test basati sull'intelligenza artificiale che aggiornano automaticamente i localizzatori, riducendo la fragilitร  degli script e i costi di manutenzione.

Riassumi questo post con: