Cos'è il modello a oggetti della pagina?
Page Object Model (POM) è un modello di progettazione, 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 questo modello, per ogni pagina web dell'applicazione, dovrebbe esserci una corrispondente Page Class. Questa classe Page identificherà gli elementi Web di quella pagina Web e contiene anche metodi Page che eseguono operazioni su quegli elementi Web. Il nome di questi metodi deve essere fornito in base all'attività che stanno eseguendo, ovvero, se un caricatore è in attesa della visualizzazione del gateway di pagamento, il nome del metodo POM può essere waitForPaymentScreenDisplay ().
In questo tutorial imparerai-
- Perché il modello a oggetti della pagina?
- Vantaggi di POM
- Come implementare POM?
- Cos'è Page Factory?
- TestCase Guru99 con il concetto di Page Factory
- AjaxElementLocatorFactory
Perché il modello a oggetti della pagina?
L'avvio di un'automazione dell'interfaccia utente in Selenium WebDriver NON è un compito difficile. Hai solo bisogno di trovare elementi, eseguire operazioni su di esso.
Considera questo semplice script per accedere a un sito web
Come puoi osservare, tutto ciò che stiamo facendo è trovare elementi e riempire i valori per quegli elementi.
Questa è una piccola sceneggiatura. La manutenzione degli script sembra facile. Ma con il tempo la suite di test crescerà. Man mano che aggiungi sempre più righe al tuo codice, le cose diventano difficili.
Il problema principale con la manutenzione degli script è che se 10 script diversi utilizzano lo stesso elemento di pagina, con qualsiasi modifica in quell'elemento, è necessario modificare tutti e 10 gli script. Questo richiede tempo ed è soggetto a errori.
Un approccio migliore alla manutenzione degli script consiste nel creare un file di classe separato che possa trovare elementi web, riempirli o verificarli. Questa classe può essere riutilizzata in tutti gli script utilizzando quell'elemento. In futuro, se c'è una modifica nell'elemento web, dobbiamo apportare la modifica in un solo file di classe e non in 10 script diversi.
Questo approccio è chiamato Page Object Model in Selenium. Aiuta a rendere il codice più leggibile, gestibile e riutilizzabile.
Vantaggi di POM
- Page Object Design Pattern afferma che le operazioni e i flussi nell'interfaccia utente devono essere separati dalla verifica. Questo concetto rende il nostro codice più pulito e facile da capire.
- Il secondo vantaggio è che il repository di oggetti è indipendente dai casi di test, quindi possiamo utilizzare lo stesso repository di oggetti per uno scopo diverso con strumenti diversi. Ad esempio, possiamo integrare Page Object Model in Selenium con TestNG / JUnit per i test funzionali e allo stesso tempo con JBehave / Cucumber per i test di accettazione.
- Il codice viene ridotto e ottimizzato a causa dei metodi di pagina riutilizzabili nelle classi POM.
- I metodi ottengono nomi più realistici che possono essere facilmente mappati con l'operazione che si verifica nell'interfaccia utente. cioè se dopo aver cliccato sul pulsante arriviamo alla home page, il nome del metodo sarà come 'gotoHomePage ()'.
Come implementare POM?
POM semplice:
È la struttura di base del framework del modello a oggetti Page in cui tutti gli elementi Web dell'AUT e il metodo che opera su questi elementi Web sono mantenuti all'interno di un file di classe. Un'attività come la verifica dovrebbe essere separata come parte dei metodi di test.
Esempio completo
TestCase: vai al sito demo di Guru99.
Passaggio 1) Vai al sito demo Guru99 | |
Passaggio 2) Nella home page è presente il testo di verifica "Guru99 Bank" | |
Passaggio 3) Accedi all'applicazione | |
Passaggio 4) Verifica che la home page contenga testo come "ID Manger: demo" |
Qui abbiamo a che fare con 2 pagine
- Pagina di login
- Home page (visualizzata una volta effettuato l'accesso)
Di conseguenza, creiamo 2 POM nelle classi Selenium
Guru99 Pagina di accesso POM
pagine del pacchetto;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;public class Guru99Login {Driver WebDriver;By user99GuruName = By.name ("uid");Per password99Guru = Per.name ("password");Per titleText = By.className ("barone");Per login = By.name ("btnLogin");public Guru99Login (driver WebDriver) {this.driver = driver;}// Imposta il nome utente nella casella di testopublic void setUserName (String strUserName) {driver.findElement (user99GuruName) .sendKeys (strUserName);}// Imposta la password nella casella di testo della passwordpublic void setPassword (String strPassword) {driver.findElement (password99Guru) .sendKeys (strPassword);}// Fare clic sul pulsante di accessopublic void clickLogin () {driver.findElement (login) .click ();}// Ottieni il titolo della pagina di accessopublic String getLoginTitle () {return driver.findElement (titleText) .getText ();}/ *** Questo metodo POM verrà esposto nel caso di test per accedere all'applicazione* @param strUserName* @param strPasword* @ritorno* /public void loginToGuru99 (String strUserName, String strPasword) {// Compila il nome utentethis.setUserName (strUserName);// Inserisci la passwordthis.setPassword (strPasword);// Fare clic sul pulsante Accedithis.clickLogin ();}}
Guru99 Home Page POM in selenio
pagine del pacchetto;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;public class Guru99HomePage {Driver WebDriver;By homePageUserName = By.xpath ("// table // tr [@ class = 'intestazione3']");public Guru99HomePage (driver WebDriver) {this.driver = driver;}// Ottieni il nome utente dalla home pagepublic String getHomePageDashboardUserName () {return driver.findElement (homePageUserName) .getText ();}}
Guru99 Simple POM in Selenium Test case
test del pacchetto;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";Driver WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nuovo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** Questo test case accederà a http://demo.guru99.com/V4/* Verifica il titolo della pagina di accesso come banca guru99* Accedi all'applicazione* Verifica la home page utilizzando il messaggio Dashboard* /@Test (priorità = 0)public void test_Home_Page_Appear_Correct () {// Crea un oggetto Pagina di accessoobjLogin = new Guru99Login (driver);// Verifica il titolo della pagina di accessoString loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Contains ("guru99 bank"));// accedi all'applicazioneobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// vai alla pagina successivaobjHomePage = new Guru99HomePage (driver);// Verifica la home pageAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Contains ("manger id: mgr123"));}
Cos'è Page Factory nel selenio?
Page Factory in Selenium è un concetto di framework di Page Object Model integrato per Selenium WebDriver ma è molto ottimizzato. 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 del repository degli oggetti della pagina e dei metodi di test. Inoltre, con l'aiuto della classe PageFactory in Selenium, utilizziamo le annotazioni @FindBy per trovare WebElement. Usiamo il metodo initElements per inizializzare gli elementi web
@FindBy può accettare tagName, partialLinkText, name, linkText, id, css, className, xpath come attributi.
Diamo un'occhiata allo stesso esempio di cui sopra usando Page Factory
Pagina di login di Guru99 con Page Factory
pacchetto 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 {/ *** Tutti gli elementi Web sono identificati dall'annotazione @FindBy* /Driver WebDriver;@FindBy (name = "uid")WebElement user99GuruName;@FindBy (nome = "password")WebElement password99Guru;@FindBy (className = "barone")WebElement titleText;@FindBy (name = "btnLogin")Accesso a WebElement;public Guru99Login (driver WebDriver) {this.driver = driver;// Questo metodo initElements creerà tutti i WebElementsPageFactory.initElements (driver, this);}// Imposta il nome utente nella casella di testopublic void setUserName (String strUserName) {user99GuruName.sendKeys (strUserName);}// Imposta la password nella casella di testo della passwordpublic void setPassword (String strPassword) {password99Guru.sendKeys (strPassword);}// Fare clic sul pulsante di accessopublic void clickLogin () {login.click ();}// Ottieni il titolo della pagina di accessopublic String getLoginTitle () {return titleText.getText ();}/ *** Questo metodo POM verrà esposto nel caso di test per accedere all'applicazione* @param strUserName* @param strPasword* @ritorno* /public void loginToGuru99 (String strUserName, String strPasword) {// Compila il nome utentethis.setUserName (strUserName);// Inserisci la passwordthis.setPassword (strPasword);// Fare clic sul pulsante Accedithis.clickLogin ();}}
Guru99 Home Page con Page Factory
pacchetto 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 {Driver WebDriver;@FindBy (xpath = "// table // tr [@ class = 'intestazione3']")WebElement homePageUserName;public Guru99HomePage (driver WebDriver) {this.driver = driver;// Questo metodo initElements creerà tutti i WebElementsPageFactory.initElements (driver, this);}// Ottieni il nome utente dalla home pagepublic String getHomePageDashboardUserName () {return homePageUserName.getText ();}}
TestCase Guru99 con il concetto di Page Factory
test del pacchetto;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";Driver WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nuovo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** Questo test va a http://demo.guru99.com/V4/* Verifica il titolo della pagina di accesso come banca guru99* Accedi all'applicazione* Verifica la home page utilizzando il messaggio Dashboard* /@Test (priorità = 0)public void test_Home_Page_Appear_Correct () {// Crea un oggetto Pagina di accessoobjLogin = new Guru99Login (driver);// Verifica il titolo della pagina di accessoString loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Contains ("guru99 bank"));// accedi all'applicazioneobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// vai alla pagina successivaobjHomePage = new Guru99HomePage (driver);// Verifica la home pageAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Contains ("manger id: mgr123"));}}
La struttura completa del progetto sarà simile al diagramma:
AjaxElementLocatorFactory
AjaxElementLocatorFactory è un concetto di caricamento pigro di PageFactory in Selenium. Viene utilizzato per trovare gli elementi Web solo quando gli elementi vengono utilizzati in qualsiasi operazione. Assegna un timeout per WebElements alla classe della pagina dell'oggetto. Uno dei principali vantaggi dell'utilizzo del pattern PageFactory in Selenium è AjaxElementLocatorFactory Class.
Qui, 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, l'esecuzione del test case genererà l'eccezione "NoSuchElementException".
Sommario
- Page Object Model in Selenium Websdriver è un modello di progettazione del repository di oggetti.
- Il modello a oggetti della pagina Selenium crea il nostro codice di test mantenibile, riutilizzabile.
- Page Factory è un modo ottimizzato per creare repository di oggetti nel concetto di framework Page Object Model.
- AjaxElementLocatorFactory è un concetto di caricamento lazy in Page Factory: modello di progettazione degli oggetti della pagina per identificare gli elementi Web solo quando vengono utilizzati in qualsiasi operazione.
Scarica i file di progetto Selenium per la demo in questo tutorial