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().

Model de obiect de pagină

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

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

Model de obiect de pagină

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 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.
  3. Codul devine mai puțin și optimizat din cauza metodelor de pagină reutilizabile din clasele POM.
  4. 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.

Implementați POM

Exemplu complet

TestCase: Accesați site-ul Demo Guru99.

Pasul 1) Accesați site-ul Demo Guru99

Implementați POM

Pasul 2) În pagina de start, verificați textul „Guru99 Bank”.

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

Aici avem de-a face cu 2 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 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

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

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

Fabrica de pagini în Selenium

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

Fabrica de localizare a elementelor Ajax

Rezumat

  1. Modelul obiectului paginii în Selenium WebDriver este un model de proiectare a depozitului de obiecte.
  2. Selenium modelul obiect de pagină creează codul nostru de testare care poate fi întreținut, reutilizabil.
  3. Page Factory este o modalitate optimizată de a crea un depozit de obiecte în conceptul cadru Page Object Model.
  4. 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

Citește mai mult Readmore