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: