Page Object Model (POM) i Page Factory in Selenium

Što je Page Object Model?

Model objekta stranice (POM) je obrazac dizajna, popularno korišten u automatizaciji testiranja koji stvara Object Repository za elemente web sučelja. Prednost modela je što smanjuje dupliciranje koda i poboljšava održavanje testa.

Prema ovom modelu, za svaku web stranicu u aplikaciji trebala bi postojati odgovarajuća klasa stranice. Ova klasa stranice identificirat će WebElemente te web stranice i također sadrži metode stranice koje izvode operacije na tim WebElementima. Naziv ovih metoda treba dati prema zadatku koji obavljaju, tj. ako učitavač čeka da se pojavi pristupnik plaćanja, naziv POM metode može biti waitForPaymentScreenDisplay().

Model objekta stranice

Zašto Page Object Model?

Pokretanje automatizacije korisničkog sučelja u Selenium WebDriver NIJE težak zadatak. Vi samo trebate pronaći elemente, izvršiti operacije na njima.

Razmotrite ovu jednostavnu skriptu za prijavu na web mjesto

Model objekta stranice

Kao što vidite, sve što radimo je pronalaženje elemenata i ispunjavanje vrijednosti za te elemente.

Ovo je mala skripta. Održavanje skripte izgleda jednostavno. Ali s vremenom će testni paket rasti. Kako svom kodu dodajete sve više redaka, stvari postaju teške.

Glavni problem s održavanjem skripte je da ako 10 različitih skripti koristi isti element stranice, uz bilo kakvu promjenu u tom elementu, trebate promijeniti svih 10 skripti. Ovo oduzima puno vremena i podložno je greškama.

Bolji pristup održavanju skripte je kreiranje zasebne datoteke klase koja bi pronašla web elemente, ispunila ih ili provjerila. Ova se klasa može ponovno koristiti u svim skriptama koje koriste taj element. Ubuduće, ako dođe do promjene u web elementu, moramo izvršiti promjenu u samo 1 class datoteci, a ne u 10 različitih skripti.

Ovaj pristup se naziva Page Object Model in Selenium. Pomaže kod učiniti čitljivijim, održavanijim i višekratnim.

Model objekta stranice

Prednosti POM-a

  1. Page Object Design Pattern kaže da operacije i tokovi u korisničkom sučelju trebaju biti odvojeni od verifikacije. Ovaj koncept čini naš kod čišćim i lakšim za razumijevanje.
  2. Druga prednost je što je repozitorij objekata neovisan o testnim slučajevima, tako da možemo koristiti isti repozitorij objekata za različite svrhe s različitim alatima. Na primjer, možemo integrirati Page Object Model Selenium s TestNG/JUnit za funkcionalne Ispitivanje i u isto vrijeme s JBehave/Cucumber za ispitivanje prihvatljivosti.
  3. Kod postaje manje i optimiziran zbog metoda stranica koje se mogu ponovno koristiti u POM klasama.
  4. Metode dobivaju realističnija imena koja se mogu lako mapirati s operacijom koja se odvija u korisničkom sučelju. tj. ako nakon klika na gumb dođemo na početnu stranicu, naziv metode će biti poput 'gotoHomePage()'.

Kako implementirati POM?

Jednostavan POM:

To je osnovna struktura okvira modela objektnih stranica u kojoj su svi Web elementi Austrije a metode koje rade na ovim web elementima održavaju se unutar datoteke klase. Zadatak poput verifikacije trebao bi biti odvojen kao dio testnih metoda.

Implementirati POM

Kompletan primjer

Testni slučaj: Idite na demo stranicu Guru99.

Korak 1) Idite na demo stranicu Guru99

Implementirati POM

Korak 2) Na početnoj stranici provjerite postoji li tekst "Guru99 Bank".

Implementirati POM

Korak 3) Prijavite se u aplikaciju

Implementirati POM

Korak 4) Provjerite sadrži li početna stranica tekst kao "ID upravitelja: demo"

Implementirati POM

Ovdje se radi o 2 stranice

  1. Prijavite stranicu
  2. Početna stranica (prikazuje se kada se prijavite)

U skladu s tim, stvaramo 2 POM in Selenium Nastava

Guru99 Stranica za prijavu 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();        
    }

}

Guru99 Početna stranica 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 Jednostavan POM in Selenium Testni slučaj

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("http://demo.guru99.com/V4/");

    }

    /**

     * This test case will login in http://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"));

    }

U čemu je Page Factory Selenium?

Tvornica stranica u Selenium je ugrađeni okvirni koncept Page Object Model za Selenium WebDriver, ali je vrlo optimiziran. Koristi se za inicijalizaciju Page objekata ili za instanciranje samog Page objekta. Također se koristi za inicijalizaciju elemenata klase stranice bez korištenja "FindElement/s."

Ovdje također slijedimo koncept odvajanja Page Object Repository i Test Methods. Dodatno, uz pomoć klase PageFactory in Selenium, koristimo bilješke @FindBy pronaći WebElement. Koristimo metodu initElements za inicijalizaciju web elemenata

Page Factory In Selenium

@FindBy može prihvatiti tagName, partialLinkText, name, linkText, id, css, className, xpath kao atributi.

Pogledajmo isti primjer kao i gore koristeći Page Factory

Guru99 Stranica za prijavu s 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();           

    }

}

Početna stranica Guru99 s tvornicom stranica

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 s konceptom 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("http://demo.guru99.com/V4/");

    }

    /**

     * This test go to http://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"));

    }

}

Potpuna struktura projekta izgledat će kao dijagram:

Tvornica stranica u Selenium

AjaxElementLocatorFactory

AjaxElementLocatorFactory je koncept lijenog učitavanja PageFactory u Selenium. Koristi se za pronalaženje web elemenata samo kada se elementi koriste u bilo kojoj operaciji. Dodjeljuje vremensko ograničenje za WebElements klasi stranice objekta. Jedna od ključnih prednosti korištenja uzorka PageFactory u Selenium je klasa AjaxElementLocatorFactory.

Ovdje, kada se izvrši operacija na elementu, čekanje njegove vidljivosti počinje tek od tog trenutka. Ako element nije pronađen u zadanom vremenskom intervalu, Testni slučaj izvršenje će izbaciti iznimku 'NoSuchElementException'.

Tvornica lokatora AjaxElement

rezime

  1. Model objekta stranice u Selenium WebDriver je uzorak dizajna spremišta objekata.
  2. Selenium objektni model stranice stvara naš kod za testiranje koji se može održavati, ponovno koristiti.
  3. Page Factory je optimizirani način za stvaranje repozitorija objekata u okvirnom konceptu Page Object Model.
  4. AjaxElementLocatorFactory je koncept odlijepljenog učitavanja u Page Factory – obrazac dizajna objekta stranice za prepoznavanje WebElemenata samo kada se koriste u bilo kojoj operaciji.

Preuzimanje Selenium Projektne datoteke za demo u ovom vodiču

opširnije Čitaj više