Sideobjektmodell og fabrikk i Selenium

โšก Smart oppsummering

Sideobjektmodell og sidefabrikk i Selenium definere et strukturert designmรธnster for รฅ bygge robuste, vedlikeholdbare rammeverk for testautomatisering. Den legger vekt pรฅ รฅ lage sidespesifikke klasser som innkapsler WebElements og deres oppfรธrsel, og dermed redusere duplisering og forbedre lesbarheten og skalerbarheten til Selenium testskript.

  • Kjernekonsept: Hver applikasjonsside tilsvarer en dedikert sideklasse som inneholder bรฅde WebElements og handlingene som utfรธres pรฅ dem, noe som muliggjรธr et klart skille mellom brukergrensesnittstruktur og testlogikk.
  • Implementeringsfokus: POM fremmer gjenbrukbar og sentralisert elementadministrasjon โ€“ endringer av sideelementer krever oppdateringer i bare รฉn klasse i stedet for flere skript.
  • Designfordel: Modellen sikrer renere, modulรฆre og verktรธyuavhengige objektlagre som kan integreres med rammeverk som TestNG, JUnit, Cucumber, eller JBehave.
  • Navnekonvensjon: Metoder i sideklasser mรฅ gjenspeile faktiske handlinger i brukergrensesnittet (f.eks. gotoHomePage()), forsterkning av semantisk klarhet i automatiseringsarbeidsflyter.
  • Forbedret struktur: Page Factory forbedrer POM ved รฅ bruke @FindBy annoteringer og PageFactory.initElements() for automatisk WebElement-initialisering, eliminerer repeterende findElement samtaler.
  • Ytelsesoptimalisering: AjaxElementLocatorFactory introduserer lat lasting โ€“ elementer finnes bare nรฅr de รฅpnes โ€“ noe som forbedrer utfรธrelseseffektiviteten og hรฅndterer dynamisk sideoppfรธrsel pรฅ en elegant mรฅte.
  • Utfall: Den enhetlige tilnรฆrmingen resulterer i en vedlikeholdbar, lesbar og skalerbar arkitektur for testautomatisering i trรฅd med moderne Selenium praksis.

Sideobjektmodell

Hva er en sideobjektmodell? Hva er dens viktigste komponenter?

Sideobjektmodell (POM) er et designmรธnster, populรฆrt brukt i testautomatisering, som oppretter et objektarkiv for elementer i webgrensesnittet. Fordelen med modellen er at den reduserer kodeduplisering og forbedrer testvedlikehold.

Under denne modellen skal det for hver nettside i applikasjonen finnes en tilsvarende sideklasse. Denne sideklassen vil identifisere webelementene til den nettsiden og inneholder ogsรฅ sidemetoder som utfรธrer operasjoner pรฅ disse webelementene. Navnene pรฅ disse metodene skal oppgis i henhold til oppgaven de utfรธrer, dvs. hvis en laster venter pรฅ at betalingsgatewayen skal vises, kan POM-metodenavnet vรฆre waitForPaymentScreenDisplay().

Viktige komponenter i sideobjektmodellen

  • Sideklasser: Representer hver nettside som en egen klasse.
  • Lokatorer: Identifiser webelementer ved hjelp av ID-er, XPath-er eller CSS-selektorer.
  • Metoder: Inneholder handlinger eller operasjoner utfรธrt pรฅ .page-elementene.
  • gjenbruk: PromoGjenbruk av tes-kode og enklere vedlikehold pรฅ tvers av tester.
  • Separasjon av bekymringer: Holder sidestrukturen uavhengig av testlogikk for bedre organisering.

Sideobjektmodell

Hvorfor sideobjektmodell?

Starte en UI-automatisering i Selenium webdriver er IKKE en vanskelig oppgave. Du trenger bare รฅ finne elementer og utfรธre operasjoner pรฅ dem.

Tenk pรฅ dette enkle skriptet for รฅ logge inn pรฅ et nettsted.

Sideobjektmodell

Som du kan se, er alt vi gjรธr รฅ finne elementer og fylle ut verdier for disse elementene.

Dette er et tidkrevende skript som er utsatt for feil. Det virker enkelt i starten, men etter hvert som testpakken utvides, blir det vanskelig รฅ administrere endringer i elementene. Men med tiden vil testpakken vokse. Etter hvert som du legger til flere og flere linjer i koden din, blir ting vanskeligere.

Hovedproblemet med skriptvedlikehold er at hvis 10 forskjellige skript bruker det samme sideelementet, med enhver endring i det elementet, mรฅ du endre alle 10 skriptene. Dette er tidkrevende og utsatt for feil.

En bedre tilnรฆrming til skriptvedlikehold er รฅ opprette en egen klassefil som finner webelementer, fyller dem ut eller verifiserer dem. Denne klassen kan deretter brukes pรฅ nytt pรฅ tvers av flere testskript som samhandler med det samme elementet. Hvis det i fremtiden er en endring i webelementet, mรฅ vi gjรธre endringen i bare รฉn klassefil og ikke 10 forskjellige skript.

Denne tilnรฆrmingen kalles Page Object Model i SeleniumDet bidrar til รฅ gjรธre koden mer lesbar, vedlikeholdbar og gjenbrukbar.

 Sideobjektmodell

๐Ÿ‘‰ Meld deg pรฅ gratis live Selenium Prosjekt

Fordeler med POM

  1. Page Object Design Pattern sier at operasjoner og flyter i brukergrensesnittet skal skilles fra verifisering. Dette konseptet gjรธr koden vรฅr renere og enkel รฅ forstรฅ.
  2. Den andre fordelen er at objektarkivet er uavhengig av testtilfeller, slik at vi kan bruke det samme objektarkivet til et annet formรฅl med forskjellige verktรธy. For eksempel kan vi integrere Page Object Model i Selenium med TestNG/JUnit for funksjonell Testing og samtidig med JBehave/Cucumber for akseptansetesting.
  3. Code blir mindre og optimalisert fordi den gjenbruker sidemetoder i POM-klassene.
  4. Metoder fรฅr mer realistiske navn som enkelt kan tilordnes operasjonen som skjer i brukergrensesnittet. Dvs. hvis vi lander pรฅ hjemmesiden etter รฅ ha klikket pรฅ knappen, vil metodenavnet vรฆre som 'gotoHomePage()'.

Hvordan implementere POM i Selenium?

Enkel PLog i den grunnleggende strukturen til et Page Object Model-rammeverk, der whereManagereIDE-elementene til AUT og metoden som opererer pรฅ disse webelementene vedlikeholdes i en tilstoppingsfil. En oppgave som verifisering bรธr vรฆre separat som en del av testmetodene.

Implementer POM

Komplett eksempel

Testforsรธk: Gรฅ til Guru99 Demoside.

Trinn 1) Gรฅ til Guru99 Demoside

Implementer POM

Trinn 2) Pรฅ hjemmesiden, sjekk at teksten ยซGuruยซ99 Bankยป er til stede

Implementer POM

Trinn 3) Logg pรฅ applikasjonen

Implementer POM

Trinn 4) Bekreft at hjemmesiden inneholder tekst som "Manger Id: demo"

Implementer POM

I dette eksemplet har vi รฅ gjรธre med to sider:

  1. Pรฅloggingssiden
  2. Hjemmeside (vises nรฅr du logger pรฅ)

Fรธlgelig lager vi 2 POM i Selenium klasser

Guru99 Innloggingsside 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 Hjemmeside POM i 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 Enkel POM i Selenium Test tilfelle

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

Hva er Page Factory i Selenium?

Page Factory i Selenium er et innebygd Page Object Model-rammekonsept for Selenium WebDriver som forbedrer vedlikeholdbarheten ved รฅ redusere repeterende elementoppslag ved hjelp av annoteringer, ikke etter utfรธrelseshastighet. Den brukes til initialisering av sideobjekter eller for รฅ instansiere selve sideobjektet. Den brukes ogsรฅ til รฅ initialisere sideklasseelementer uten รฅ bruke ยซFindElement/sยป.

Ogsรฅ her fรธlger vi konseptet med separasjon av Page Object Repository og testmetoder. I tillegg, ved hjelp av klassen PageFactory i Selenium, bruker vi merknader @FindBy for รฅ finne WebElement. Vi bruker initElements-metoden for รฅ initialisere webelementer.

Page Factory In Selenium

@FindBy kan godta tagName, partialLinkText, name, linkText, id, css, className, xpath som attributter.

La oss se pรฅ samme eksempel som ovenfor ved รฅ bruke Page Factory

Guru99 Innloggingsside med 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();           
    }
}

Guru99 Hjemmeside med 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 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 med Page Factory-konseptet

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

Komplett prosjektstruktur vil se ut som diagrammet:

Page Factory i Selenium

AjaxElementLocatorFactory

AjaxElementLocatorFactory er et lat innlastingskonsept av PageFactory i SeleniumDen brukes til รฅ finne webelementene bare nรฅr elementene brukes i en operasjon. Den tilordner en tidsavbrudd for WebElements til objektets sideklasse. En av hovedfordelene med รฅ bruke PageFactory-mรธnsteret i Selenium er AjaxElementLocatorFactory Class.

Her, nรฅr en operasjon utfรธres pรฅ et element, starter ventetiden pรฅ synligheten fรธrst fra det รธyeblikket. Hvis elementet ikke finnes innen det gitte tidsintervallet, Testsak kjรธring vil gi 'NoSuchElementException' unntak.

AjaxElement Locator Factory

For eksempel:

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

Last ned Selenium Prosjektfiler for demoen i denne opplรฆringen

Spรธrsmรฅl og svar

Sideobjektmodellen er et designmรธnster som absorberertracts nettsideelementer i separate klasser. Det forenkler automatisering ved รฅ skille brukergrensesnittinteraksjoner fra testlogikk, noe som fremmer klarhet, skalerbarhet og redusert kodeduplisering.

In Selenium, POM representerer hver nettside som en dedikert klasse som inneholder lokatorer og handlinger. Den innkapsler UI-elementer, slik at testskript kan forbli uavhengige av endringer i den underliggende sidestrukturen.

POM er ikke et frittstรฅende rammeverk, men et designmรธnster. Det kan integreres i ethvert automatiseringsrammeverk for รฅ strukturere tester effektivt, noe som sikrer bedre organisering, gjenbrukbarhet og vedlikeholdbarhet.

POM er et designprinsipp der hver nettside modelleres som en klasse med definerte lokatorer og metoder. Det frikobler testlogikk fra UI-elementer, noe som forbedrer lesbarhet, skalerbarhet og langsiktig vedlikehold.

POM definerer designstrukturen for sideabstracsjon, mens Page Factory tilbyr annoteringer og metoder (@FindBy) for effektiv initialisering av webelementer. Page Factory er en implementeringsforbedring av POM.

POM sentraliserer elementlokalisering og sidehandlinger i dedikerte klasser. Enhver modifikasjon av brukergrensesnittet krever oppdateringer pรฅ bare ett sted, noe som minimerer omarbeiding, forbedrer gjenbruk av kode og akselererer testvedlikehold.

Ja. AI-drevne testgeneratorer kan opprette POM-klasser automatisk ved รฅ analysere UI-hierarkier, opprettholde logisk separasjon av bekymringer samtidig som de akselererer ende-til-ende-tester.

POM fremmer modulรฆre og gjenbrukbare testkomponenter, noe som muliggjรธr integrering med AI-baserte testvedlikeholdsverktรธy som automatisk oppdaterer lokatorer, noe som reduserer skriptskjรธrhet og vedlikeholdskostnader.

Oppsummer dette innlegget med: