Sivun kohteen malli ja tehdas Selenium

Mikä on sivuobjektimalli?

Sivun objektimalli (POM) on suunnittelumalli, jota käytetään yleisesti testiautomaatiossa ja joka luo objektivaraston web-käyttöliittymäelementeille. Mallin etuna on, että se vähentää koodin päällekkäisyyttä ja parantaa testien ylläpitoa.

Tässä mallissa jokaisella sovelluksen verkkosivulla tulisi olla vastaava sivuluokka. Tämä Page-luokka tunnistaa kyseisen verkkosivun WebElementit ja sisältää myös sivumenetelmiä, jotka suorittavat toimintoja näille WebElementeille. Näiden menetelmien nimet tulee antaa niiden suorittaman tehtävän mukaan, eli jos lataaja odottaa maksuyhdyskäytävän ilmestymistä, POM-menetelmän nimi voi olla waitForPaymentScreenDisplay().

Sivun objektimalli

Miksi sivuobjektimalli?

Käyttöliittymän automatisoinnin käynnistäminen Selenium WebDriver EI ole vaikea tehtävä. Sinun tarvitsee vain löytää elementtejä, suorittaa toimintoja sille.

Harkitse tätä yksinkertaista komentosarjaa kirjautuaksesi verkkosivustolle

Sivun objektimalli

Kuten huomaat, me vain etsimme elementtejä ja täytämme niille elementtejä.

Tämä on pieni käsikirjoitus. Skriptin ylläpito näyttää helpolta. Mutta ajan myötä testipaketti kasvaa. Kun lisäät yhä enemmän rivejä koodiisi, asiat muuttuvat vaikeiksi.

Komentosarjojen ylläpidon suurin ongelma on, että jos 10 eri komentosarjaa käyttää samaa sivuelementtiä, sinun on vaihdettava kaikki 10 komentosarjaa, jos elementtiä muutetaan. Tämä on aikaa vievää ja virhealtista.

Parempi tapa skriptien ylläpitoon on luoda erillinen luokkatiedosto, joka löytää verkkoelementtejä, täyttää ne tai tarkistaa ne. Tätä luokkaa voidaan käyttää uudelleen kaikissa kyseistä elementtiä käyttävistä skripteistä. Jatkossa, jos verkkoelementissä tapahtuu muutos, meidän on tehtävä muutos vain yhteen luokkatiedostoon, ei kymmeneen eri komentosarjaan.

Tätä lähestymistapaa kutsutaan sivuobjektimalliksi Selenium. Se auttaa tekemään koodista luettavamman, ylläpidettävämmän ja uudelleenkäytettävän.

Sivun objektimalli

POM:n edut

  1. Page Object Design Pattern sanoo, että käyttöliittymän toiminnot ja virrat tulee erottaa todentamisesta. Tämä konsepti tekee koodistamme selkeämmän ja helposti ymmärrettävän.
  2. Toinen etu on, että objektivarasto on riippumaton testitapauksista, joten voimme käyttää samaa objektivarastoa eri tarkoitukseen eri työkaluilla. Voimme esimerkiksi integroida sivuobjektimallin Selenium with TestNG/JUnit toiminnallisille Testaus ja samaan aikaan JBehaven kanssa/Cucumber hyväksymistestausta varten.
  3. Koodi vähenee ja optimoidaan POM-luokkien uudelleenkäytettävien sivumenetelmien ansiosta.
  4. Menetelmät saavat realistisempia nimiä, jotka voidaan helposti kartoittaa käyttöliittymässä tapahtuvan toiminnan kanssa. eli jos painikkeen painamisen jälkeen pääsemme kotisivulle, menetelmän nimi on kuin 'gotoHomePage()'.

Kuinka ottaa POM käyttöön?

Yksinkertainen POM:

Se on sivuobjektimallikehyksen perusrakenne, jossa kaikki Web-elementit AUT ja näissä Web-elementeissä toimiva menetelmä säilytetään luokkatiedostossa.Tehtävän, kuten todentamisen, tulisi olla erillinen osana Testimenetelmiä.

Ota POM käyttöön

Täydellinen esimerkki

Testitapaus: Siirry Guru99-demosivustolle.

Vaihe 1) Siirry Guru99-demosivustolle

Ota POM käyttöön

Vaihe 2) Kotisivulla on tarkistusteksti "Guru99 Bank".

Ota POM käyttöön

Vaihe 3) Kirjaudu sisään sovellukseen

Ota POM käyttöön

Vaihe 4) Varmista, että kotisivulla on tekstiä "Manger Id: demo"

Ota POM käyttöön

Tässä käsittelemme 2 sivua

  1. Kirjaudu Page
  2. Kotisivu (näkyy, kun kirjaudut sisään)

Sen mukaisesti luomme 2 POM-in Selenium luokat

Guru99 Kirjautumissivu 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 kotisivu POM sisää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 Simple POM sisään Selenium Testitapaus

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

    }

Mitä Page Factory sisältää Selenium?

Sivun tehdas sisään Selenium on sisäänrakennettu Page Object Model -kehyskonsepti Selenium WebDriver, mutta se on erittäin optimoitu. Sitä käytetään sivu-objektien alustamiseen tai itse sivu-objektin luomiseen. Sitä käytetään myös sivuluokan elementtien alustamiseen ilman "FindElement/s" käyttöä.

Tässäkin noudatamme käsitettä sivuobjektivaraston ja testimenetelmien erottamisesta. Lisäksi luokan PageFactory in avulla Selenium, käytämme huomautuksia @FindBy löytääksesi WebElementin. Käytämme initElements-menetelmää verkkoelementtien alustamiseen

Sivun tehdas Selenium

@FindBy voi hyväksyä tagName, partialLinkText, name, linkText, id, css, className, xpath määritteinä.

Katsotaanpa samaa esimerkkiä kuin yllä käyttäen Page Factory -ohjelmaa

Guru99 kirjautumissivu Page Factorylla

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 kotisivu sivutehtaalla

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 Page Factory -konseptilla

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

    }

}

Täydellinen projektirakenne näyttää kaaviolta:

Sivun tehdas sisään Selenium

AjaxElementLocatorFactory

AjaxElementLocatorFactory on PageFactory in laiska latauskonsepti Selenium. Sitä käytetään verkkoelementtien etsimiseen vain, kun elementtejä käytetään missä tahansa toiminnassa. Se määrittää WebElementeille aikakatkaisun objektisivuluokalle. Yksi PageFactory-kuvion käytön tärkeimmistä eduista Selenium on AjaxElementLocatorFactory-luokka.

Tässä kun elementille suoritetaan toimenpide, sen näkyvyyden odotus alkaa vasta siitä hetkestä. Jos elementtiä ei löydy annetulla aikavälillä, Testitapaus suoritus aiheuttaa NoSuchElementException-poikkeuksen.

AjaxElement Locator -tehdas

Yhteenveto

  1. Sivun objektimalli sisään Selenium WebDriver on Object Repository -suunnittelumalli.
  2. Selenium sivuobjektimalli luo testauskoodimme ylläpidettäväksi, uudelleen käytettäväksi.
  3. Page Factory on optimoitu tapa luoda objektivarasto Page Object Model -kehyskonseptissa.
  4. AjaxElementLocatorFactory on Page Factoryn laiska latauskonsepti – sivuobjektin suunnittelumalli, joka tunnistaa WebElementit vain, kun niitä käytetään missä tahansa toiminnossa.

Lataa Selenium Projektitiedostot esittelyä varten tässä opetusohjelmassa