Lehekülje objekti mudel ja tehas Selenium

Mis on leheobjekti mudel?

Lehekülje objekti mudel (POM) on disainimuster, mida kasutatakse laialdaselt testimise automatiseerimises, mis loob veebiliidese elementide jaoks objektihoidla. Mudeli eeliseks on see, et see vähendab koodi dubleerimist ja parandab testi hooldust.

Selle mudeli kohaselt peaks rakenduse iga veebilehe jaoks olema vastav leheklass. See leheklass tuvastab selle veebilehe veebielemendid ja sisaldab ka lehemeetodeid, mis teostavad nende veebielementidega toiminguid. Nende meetodite nimed tuleks anda vastavalt nende teostatavale ülesandele, st kui laadija ootab makselüüsi ilmumist, võib POM-i meetodi nimi olla waitForPaymentScreenDisplay().

Lehekülje objekti mudel

Miks leheobjekti mudel?

Kasutajaliidese automatiseerimise käivitamine Selenium WebDriver EI OLE raske ülesanne. Peate lihtsalt leidma elemendid, tegema sellega toiminguid.

Kaaluge seda lihtsat skripti veebisaidile sisselogimiseks

Lehekülje objekti mudel

Nagu näete, ei tee me muud, kui otsime elemente ja täidame nende elementide väärtusi.

See on väike skript. Skripti hooldus tundub lihtne. Kuid aja jooksul testikomplekt kasvab. Kui lisate oma koodile järjest rohkem ridu, muutuvad asjad keeruliseks.

Skriptihoolduse peamine probleem seisneb selles, et kui 10 erinevat skripti kasutavad sama leheelementi, peate selle elemendi mis tahes muudatuse korral muutma kõiki 10 skripti. See on aeganõudev ja veaterohke.

Parem lähenemine skriptide hooldusele on luua eraldi klassifail, mis leiab veebielemendid, täidab need või kontrollib neid. Seda klassi saab uuesti kasutada kõigis seda elementi kasutavates skriptides. Tulevikus, kui veebielemendis toimub muudatus, peame muudatuse tegema ainult ühes klassifailis, mitte kümnes erinevas skriptis.

Seda lähenemisviisi nimetatakse leheobjekti mudeliks Selenium. See aitab muuta koodi loetavamaks, hooldatavamaks ja korduvkasutatavamaks.

Lehekülje objekti mudel

POM-i eelised

  1. Leheobjekti kujundusmuster ütleb, et kasutajaliidese toimingud ja vood tuleks kinnitamisest eraldada. See kontseptsioon muudab meie koodi puhtamaks ja hõlpsasti mõistetavaks.
  2. Teine eelis on see, et objektihoidla on testjuhtumitest sõltumatu, nii et saame kasutada sama objektihoidlat erinevatel eesmärkidel erinevate tööriistadega. Näiteks saame integreerida leheobjekti mudeli Selenium koos TestNG/JUnit funktsionaalseks Testimine ja samal ajal JBehave/Cucumber vastuvõtutesti jaoks.
  3. POM-klasside korduvkasutatavate lehtede meetodite tõttu muutub kood vähemaks ja optimeerituks.
  4. Meetodid saavad realistlikumad nimed, mida saab hõlpsasti kaardistada kasutajaliideses toimuva toiminguga. st kui pärast nupule klõpsamist jõuame avalehele, on meetodi nimi nagu 'gotoHomePage()'.

Kuidas POM-i rakendada?

Lihtne POM:

See on leheobjekti mudeli raamistiku põhistruktuur, kus kõik veebielemendid AUT ja nendel veebielementidel töötavat meetodit hoitakse klassifailis. Selline ülesanne nagu kontrollimine peaks olema testimeetodite osana eraldi.

Rakendage POM

Täielik näide

TestCase: Minge Guru99 demo saidile.

Samm 1) Minge Guru99 demo saidile

Rakendage POM

Samm 2) Avalehel on kontrolltekst “Guru99 pank”.

Rakendage POM

Samm 3) Logige rakendusse sisse

Rakendage POM

Samm 4) Veenduge, et avalehel oleks tekst „halduri ID: demo”

Rakendage POM

Siin on meil tegemist 2 leheküljega

  1. Sisselogimise lehele
  2. Avaleht (kuvatakse pärast sisselogimist)

Sellest lähtuvalt loome 2 POM-i Selenium klassid

Guru99 sisselogimisleht 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 avaleht POM sisse 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 Lihtne POM sisse Selenium Katsejuhtum

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"));

    }

Milles on Page Factory Selenium?

Lehe tehas sisse Selenium on sisseehitatud leheobjekti mudeli raamistiku kontseptsioon Selenium WebDriver, kuid see on väga optimeeritud. Seda kasutatakse leheobjektide lähtestamiseks või lehe objekti enda initsialiseerimiseks. Seda kasutatakse ka leheklassi elementide lähtestamiseks ilma "FindElement/s" kasutamata.

Ka siin järgime leheobjektide hoidla ja testimismeetodite eraldamise kontseptsiooni. Lisaks klassi PageFactory in abiga Selenium, kasutame märkusi @FindBy et leida WebElement. Veebielementide lähtestamiseks kasutame meetodit initElements

Page Factory In Selenium

@FindBy võib vastu võtta tagName, osalineLinkText, nimi, lingitekst, id, css, klassinimi, xpath atribuutidena.

Vaatame sama näidet nagu ülal, kasutades Page Factory

Guru99 sisselogimisleht koos Page Factoryga

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 koduleht koos lehetehasega

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 koos Page Factory kontseptsiooniga

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"));

    }

}

Projekti täielik struktuur näeb välja nagu diagramm:

Lehe tehas sisse Selenium

AjaxElementLocatorFactory

AjaxElementLocatorFactory on PageFactory laisk laadimiskontseptsioon Selenium. Seda kasutatakse veebielementide leidmiseks ainult siis, kui elemente kasutatakse mis tahes toimingus. See määrab objekti leheklassile WebElementsi ajalõpu. Üks peamisi eeliseid mustri PageFactory kasutamisel Selenium on AjaxElementLocatorFactory klass.

Siin, kui elemendiga tehakse toiming, algab selle nähtavuse ootamine alles sellest hetkest. Kui elementi antud ajaintervalli jooksul ei leitud, Testjuhtum täitmine teeb erandi „NoSuchElementException”.

AjaxElement Locatori tehas

kokkuvõte

  1. Lehekülje objekti mudel sisse Selenium WebDriver on objektihoidla kujundusmuster.
  2. Selenium leheobjektimudel loob meie testimiskoodi hooldatava ja korduvkasutatava.
  3. Page Factory on optimeeritud viis objektihoidla loomiseks leheobjektimudeli raamistiku kontseptsioonis.
  4. AjaxElementLocatorFactory on Page Factory laisk laadimise kontseptsioon – leheobjekti kujundusmuster WebElementide tuvastamiseks ainult siis, kui neid kasutatakse mis tahes toimingus.

Lae alla Selenium Selle õpetuse demo projektifailid

Loe rohkem Readmore