Stranica Object Model & Factory in Selenium

โšก Pametni saลพetak

Objektni model stranice i tvornica stranica u Selenium definirati strukturirani obrazac dizajna za izgradnju robusnih, odrลพivih okvira za automatizaciju testiranja. Naglaลกava stvaranje klasa specifiฤnih za stranicu koje obuhvaฤ‡aju WebElemente i njihova ponaลกanja, ฤime se smanjuje dupliciranje i poboljลกava ฤitljivost i skalabilnost Selenium testne skripte.

  • Osnovni koncept: Svakoj stranici aplikacije odgovara namjenska klasa stranice koja sadrลพi i web-elemente i radnje koje se na njima izvode, ลกto omoguฤ‡uje jasno odvajanje strukture korisniฤkog suฤelja i logike testiranja.
  • Fokus implementacije: POM potiฤe ponovno upotrebljivo i centralizirano upravljanje elementima - izmjene elemenata stranice zahtijevaju aลพuriranja samo u jednoj klasi umjesto u viลกe skripti.
  • Prednost dizajna: Model osigurava ฤiลกฤ‡e, modularne i od alata neovisne repozitorije objekata koje se mogu integrirati s okvirima poput TestNG, JUnit, Cucumberili JBehave.
  • Konvencija imenovanja: Metode unutar klasa stranica moraju odraลพavati stvarne radnje korisniฤkog suฤelja (npr. gotoHomePage()), pojaฤavajuฤ‡i semantiฤku jasnoฤ‡u u automatiziranim tijekovima rada.
  • Poboljลกana struktura: Tvornica stranica poboljลกava POM koriลกtenjem @FindBy biljeลกke i PageFactory.initElements() za automatsku inicijalizaciju WebElementa, eliminirajuฤ‡i ponavljanje findElement poziva.
  • Optimizacija performansi: AjaxElementLocatorFactory uvodi lijeno uฤitavanje - elementi se lociraju samo kada im se pristupi - poboljลกavajuฤ‡i uฤinkovitost izvrลกavanja i elegantno rukovanje dinamiฤkim ponaลกanjem stranice.
  • Ishod: Ujedinjeni pristup rezultira odrลพivom, ฤitljivom i skalabilnom arhitekturom automatizacije testiranja usklaฤ‘enom s modernim Selenium prakse.

Model objekta stranice

ล to je model objekta stranice? Koje su njegove kljuฤne komponente?

Model objekta stranice (POM) je dizajnerski obrazac, popularno koriลกten u automatizaciji testiranja, koji stvara spremiลกte objekata za elemente web korisniฤkog suฤelja. Prednost modela je ลกto smanjuje dupliciranje koda i poboljลกava odrลพavanje testiranja.

Prema ovom modelu, za svaku web stranicu u aplikaciji trebala bi postojati odgovarajuฤ‡a klasa stranice. Ova klasa stranice identificirat ฤ‡e web elemente te web stranice i takoฤ‘er sadrลพi metode stranice koje izvrลกavaju operacije na tim web elementima. Imena tih metoda trebaju biti dana prema zadatku koji izvrลกavaju, tj. ako program za uฤitavanje ฤeka da se pojavi platni sustav, naziv POM metode moลพe biti waitForPaymentScreenDisplay().

Kljuฤne komponente modela objekta stranice

  • Klase stranica: Predstavite svaku web stranicu kao zasebnu klasu.
  • Lokatori: Identificirajte web elemente pomoฤ‡u ID-ova, XPath-ova ili CSS selektora.
  • Metode: Sadrลพe radnje ili operacije izvrลกene na .page elementima.
  • Ponovno koriลกtenje: Promoponovna upotreba tes koda i lakลกe odrลพavanje kroz testove.
  • Odvajanje koncerna: Odrลพava strukturu stranice neovisnom od testne logike radi bolje organizacije.

Model objekta stranice

Zaลกto Page Object Model?

Pokretanje automatizacije korisniฤkog suฤelja u Selenium webdriver NIJE teลพak zadatak. Samo trebate pronaฤ‡i elemente i izvrลกiti operacije na njima.

Razmotrite ovaj jednostavan skript za prijavu na web stranicu.

Model objekta stranice

Kao ลกto vidite, sve ลกto radimo je pronalaลพenje elemenata i ispunjavanje vrijednosti za te elemente.

Ovo je dugotrajan skript, sklon greลกkama. U poฤetku se ฤini jednostavnim, ali kako se skup testova ลกiri, upravljanje promjenama elemenata postaje teลกko. Ali s vremenom ฤ‡e se skup testova poveฤ‡avati. Kako dodajete sve viลกe i viลกe redaka u svoj kod, stvari postaju teลพe.

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 skripti je stvaranje zasebne datoteke klase koja bi pronalazila web elemente, ispunjavala ih ili provjeravala. Ova se klasa zatim moลพe ponovno koristiti u viลกe testnih skripti koje komuniciraju s istim elementom. U buduฤ‡nosti, ako doฤ‘e do promjene u web elementu, moramo napraviti promjenu u samo jednoj datoteci klase, a ne u 10 razliฤitih skripti.

Ovaj pristup se naziva Page Object Model in SeleniumPomaลพe u ฤitljivosti, odrลพavanju i ponovnoj upotrebi koda.

 Model objekta stranice

๐Ÿ‘‰ Prijavite se za besplatni prijenos uลพivo Selenium Projekt

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 objektni repozitorij neovisan o testnim sluฤajevima, tako da isti objektni repozitorij moลพemo koristiti za razliฤite svrhe s razliฤitim alatima. Na primjer, moลพemo integrirati Page Object Model u Selenium sa TestNG/JUnit za funkcionalne Ispitivanje i u isto vrijeme s JBehave/Cucumber za ispitivanje prihvatljivosti.
  3. Code postaje manji i optimiziran jer ponovno koristi metode stranice u POM klasama.
  4. Metode dobivaju realistiฤnija imena koja se mogu lako mapirati na operaciju koja se dogaฤ‘a u korisniฤkom suฤelju. tj. ako nakon klika na gumb doฤ‘emo na poฤetnu stranicu, naziv metode bit ฤ‡e poput 'gotoHomePage()'.

Kako implementirati POM u Selenium?

Jednostavni PLog u temeljnoj strukturi okvira modela objekta stranice, gdje su whereManagerElements od Austrije i metode koje rade na tim web elementima odrลพavaju se unutar clog datoteke. Zadatak poput verifikacije trebao bi biti odvojen kao dio testnih metoda.

Implementirati POM

Kompletan primjer

Testni sluฤaj: Idi na Guru99 Demo stranica.

Korak 1) Idite na Guru99 Demo stranica

Implementirati POM

Korak 2) Na poฤetnoj stranici provjerite je li tekst โ€žGuru99 Bankโ€ je prisutna

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

U ovom primjeru imamo posla s dvije 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 the 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 allows the test case to perform the login operation
     * @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 u 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 Jednostavni POM u 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("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("manager id : mgr123"));
    }

U ฤemu je Page Factory Selenium?

Tvornica stranica u Selenium je ugraฤ‘eni okvirni koncept Page Object Model za Selenium WebDriver koji poboljลกava odrลพavanje smanjenjem ponavljajuฤ‡ih pretraga elemenata pomoฤ‡u anotacija, a ne brzinom izvrลกavanja. Koristi se za inicijalizaciju objekata stranice ili za instanciranje samog objekta stranice. 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 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 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 Poฤetna stranica 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("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("manager id : mgr123"));
    }
}

Potpuna struktura projekta izgledat ฤ‡e kao dijagram:

Tvornica stranica u Selenium

AjaxElementLocatorFactory

AjaxElementLocatorFactory je koncept lijenog uฤitavanja PageFactory u SeleniumKoristi 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 operacija izvrลกi na elementu, ฤekanje na njegovu vidljivost 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

Na primjer:

AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10);
PageFactory.initElements(factory, this);

Preuzimanje Selenium Projektne datoteke za demo u ovom vodiฤu

Pitanja i odgovori

Objektni model stranice je dizajnerski uzorak kojitracts elemente web stranice u odvojene klase. Pojednostavljuje automatizaciju odvajanjem interakcija korisniฤkog suฤelja od logike testiranja, promiฤuฤ‡i jasnoฤ‡u, skalabilnost i smanjujuฤ‡i dupliciranje koda.

In SeleniumPOM predstavlja svaku web stranicu kao namjensku klasu koja sadrลพi lokatore i akcije. On enkapsulira UI elemente, omoguฤ‡ujuฤ‡i testnim skriptama da ostanu neovisne o promjenama temeljne strukture stranice.

POM nije samostalni okvir veฤ‡ obrazac dizajna. Moลพe se integrirati u bilo koji okvir za automatizaciju kako bi se uฤinkovito strukturirali testovi, osiguravajuฤ‡i bolju organizaciju, ponovnu upotrebu i odrลพavanje.

POM je princip dizajna gdje se svaka web stranica modelira kao klasa s definiranim lokatorima i metodama. Odvaja logiku testiranja od elemenata korisniฤkog suฤelja, poboljลกavajuฤ‡i ฤitljivost, skalabilnost i dugoroฤno odrลพavanje.

POM definira strukturu dizajna za abs stranicetraccija, dok Page Factory pruลพa napomene i metode (@FindBy) za uฤinkovitu inicijalizaciju web elemenata. Page Factory je implementacijsko poboljลกanje POM-a.

POM centralizira lokatore elemenata i radnje stranica unutar namjenskih klasa. Svaka modifikacija korisniฤkog suฤelja zahtijeva aลพuriranja samo na jednom mjestu, minimizirajuฤ‡i preradu, poboljลกavajuฤ‡i ponovnu upotrebu koda i ubrzavajuฤ‡i odrลพavanje testiranja.

Da. Generatori testova pokretani umjetnom inteligencijom mogu automatski stvarati POM klase analizirajuฤ‡i hijerarhije korisniฤkog suฤelja, odrลพavajuฤ‡i logiฤko odvajanje problema i ubrzavajuฤ‡i stvaranje testova od poฤetka do kraja.

POM potiฤe modularne i viลกekratno upotrebljive komponente testiranja, omoguฤ‡ujuฤ‡i integraciju s alatima za odrลพavanje testiranja temeljenim na umjetnoj inteligenciji koji automatski aลพuriraju lokatore, smanjujuฤ‡i krhkost skripti i optereฤ‡enje odrลพavanja.

Saลพmite ovu objavu uz: