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.

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.
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.
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.
๐ Iscriviti gratuitamente in diretta Selenium Progetto
Vantaggi del POM
- 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.
- 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.
- Code Diventa piรน leggero e ottimizzato grazie al riutilizzo dei metodi di pagina nelle classi POM.
- 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.
Esempio completo
Caso di prova: Vai su Guru99 Sito dimostrativo.
Passaggio 1) Vai a Guru99 Sito dimostrativo
Passaggio 2) Nella home page, verificare che il testo โGuru99 Bankโ รจ presente
Passaggio 3) Accedi all'applicazione
Passaggio 4) Verifica che la home page contenga il testo "ID manager: demo"
In questo esempio abbiamo a che fare con due pagine:
- Pagina di login
- 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.
@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:
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".
Per esempio:
AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10); PageFactory.initElements(factory, this);
Scarica la Selenium File di progetto per la demo in questo tutorial











