Pagina Obiect Model și Fabrică în Selenium
Ce este modelul de obiect de pagină?
Modelul obiectului paginii (POM) este un model de design, folosit în mod popular în automatizarea testelor, care creează obiecte de depozit pentru elementele UI 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ă de pagină corespunzătoare. Această clasă Page va identifica WebElements ale acelei pagini web și, de asemenea, conține metode Page care efectuează operațiuni pe acele WebElements. Numele acestor metode trebuie dat în funcție de sarcina pe care o îndeplinesc, adică dacă un încărcător așteaptă să apară gateway-ul de plată, numele metodei POM poate fi waitForPaymentScreenDisplay().
De ce modelul obiectului paginii?
Pornirea unei automatizări UI în Selenium WebDriver NU este o sarcină grea. Trebuie doar să găsiți elemente, să efectuați operații pe el.
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 mic scenariu. Întreținerea scriptului pare ușoară. Dar cu timpul, suita de teste va crește. Pe măsură ce adăugați din ce în ce mai multe linii la 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ă a întreținerii scriptului este crearea unui fișier de clasă separat care să găsească elemente web, să le completeze sau să le verifice. Această clasă poate fi reutilizată în toate scripturile care utilizează acel element. În viitor, dacă există o modificare a elementului web, trebuie să facem modificarea doar într-un fișier de clasă și nu în 1 scripturi diferite.
Această abordare se numește Page Object Model în Selenium. Ajută la ca codul să fie mai lizibil, mai ușor de întreținut și mai reutilizabil.
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 beneficiu este că depozitul de obiecte este independent de cazurile de testare, așa că putem folosi același depozit de obiecte pentru un scop diferit cu instrumente diferite. De exemplu, putem integra Page Object Model în Selenium cu TestNG/JUnit pentru funcțional Testarea si in acelasi timp cu JBehave/Cucumber pentru testarea de acceptare.
- Codul devine mai puțin și optimizat din cauza metodelor de pagină reutilizabile din clasele POM.
- Metodele obțin nume mai realiste care pot fi mapate cu ușurință cu operația care are loc în UI. adică dacă după ce facem clic pe butonul ajungem pe pagina de start, numele metodei va fi ca 'gotoHomePage()'.
Cum se implementează POM?
POM simplu:
Este structura de bază a cadrului modelului de obiecte Page în care toate Elementele Web ale AUT iar metoda care operează pe aceste elemente web sunt menținute în interiorul unui fișier de clasă. O sarcină precum verificarea ar trebui să fie separată ca parte a metodelor de testare.
Exemplu complet
TestCase: Accesați site-ul Demo Guru99.
Pasul 1) Accesați site-ul Demo Guru99
Pasul 2) În pagina de start, verificați textul „Guru99 Bank”.
Pasul 3) Conectați-vă la aplicație
Pasul 4) Verificați dacă pagina de pornire conține text ca „Manger Id: demo”
Aici avem de-a face cu 2 pagini
- Autentificare Pagina
- Pagina de pornire (afișată odată ce v-ați autentificat)
În consecință, creăm 2 POM în Selenium clase
Guru99 Pagina 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 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 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(); } }
Pagina de pornire Guru99 POM în 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("manger 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 WebDriver dar este foarte optimizat. Este folosit pentru inițializarea obiectelor Page sau pentru a instanția obiectul Page în sine. De asemenea, este folosit pentru a inițializa elementele 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 elemente 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
Pagina de conectare Guru99 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(); } }
Pagina de pornire Guru99 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 TestCase 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("manger id : mgr123")); } }
Structura completă a proiectului va arăta ca în diagramă:
AjaxElementLocatorFactory
AjaxElementLocatorFactory este un concept de încărcare leneșă a PageFactory în Selenium. Este folosit pentru a găsi elementele web numai atunci când elementele sunt utilizate în orice operațiune. Acesta atribuie un timeout pentru WebElements clasei de pagină obiect. Unul dintre avantajele cheie ale utilizării modelului PageFactory în Selenium este clasa AjaxElementLocatorFactory.
Aici, atunci când se efectuează o operație asupra unui element, așteptarea vizibilității acestuia î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”.
Rezumat
- Modelul obiectului paginii în Selenium WebDriver este un model de proiectare a depozitului de obiecte.
- Selenium modelul obiect de pagină creează codul nostru de testare care poate fi întreținut, reutilizabil.
- Page Factory este o modalitate optimizată de a crea un depozit de obiecte în conceptul cadru Page Object Model.
- AjaxElementLocatorFactory este un concept de încărcare leneră în Page Factory – model de proiectare a obiectelor de pagină pentru a identifica WebElements numai atunci când sunt utilizate în orice operațiune.
Descărcați Selenium Fișiere de proiect pentru demonstrația din acest tutorial