Sidobjektsmodell och fabrik i Selenium

โšก Smart sammanfattning

Sidobjektmodell och Sidfabrik i Selenium definiera ett strukturerat designmรถnster fรถr att bygga robusta, underhรฅllbara ramverk fรถr testautomation. Den betonar att skapa sidspecifika klasser som inkapslar WebElements och deras beteenden, vilket minskar dubbelarbete och fรถrbรคttrar lรคsbarheten och skalbarheten hos Selenium testskript.

  • Kรคrnkoncept: Varje applikationssida motsvarar en dedikerad sidklass som innehรฅller bรฅde WebElements och de รฅtgรคrder som utfรถrs pรฅ dem, vilket mรถjliggรถr en tydlig รฅtskillnad mellan UI-struktur och testlogik.
  • Implementeringsfokus: POM frรคmjar รฅteranvรคndbar och centraliserad elementhantering โ€“ รคndringar av sidelement krรคver uppdateringar i endast en klass istรคllet fรถr flera skript.
  • Designfรถrdelar: Modellen sรคkerstรคller renare, modulรคra och verktygsoberoende objektfรถrrรฅd som kan integreras med ramverk som TestNG, JUnit, Cucumber, eller JBehave.
  • Namnkonvention: Metoder inom sidklasser mรฅste spegla faktiska UI-รฅtgรคrder (t.ex. gotoHomePage()), fรถrstรคrker semantisk tydlighet i automatiserade arbetsflรถden.
  • Fรถrbรคttrad struktur: Page Factory fรถrfinar POM med hjรคlp av @FindBy anteckningar och PageFactory.initElements() fรถr automatisk WebElement-initiering, vilket eliminerar repetitiva findElement samtal.
  • Prestandaoptimering: AjaxElementLocatorFactory introducerar lazy loading โ€“ element hittas endast nรคr de รถppnas โ€“ vilket fรถrbรคttrar exekveringseffektiviteten och hanterar dynamiskt sidbeteende pรฅ ett elegant sรคtt.
  • Resultat: Det enhetliga tillvรคgagรฅngssรคttet resulterar i en underhรฅllbar, lรคsbar och skalbar arkitektur fรถr testautomation i linje med moderna Selenium praxis.

Sidobjektmodell

Vad รคr en sidobjektmodell? Vilka รคr dess nyckelkomponenter?

Sidobjektsmodell (POM) รคr ett designmรถnster, populรคrt anvรคnt inom testautomation, som skapar ett objektarkiv fรถr element i webbgrรคnssnittet. Fรถrdelen med modellen รคr att den minskar koddubbletter och fรถrbรคttrar testunderhรฅllet.

Enligt den hรคr modellen bรถr det fรถr varje webbsida i applikationen finnas en motsvarande sidklass. Denna sidklass identifierar webbsidans WebElements och innehรฅller รคven sidmetoder som utfรถr operationer pรฅ dessa WebElements. Namnen pรฅ dessa metoder bรถr anges enligt den uppgift de utfรถr, dvs. om en laddare vรคntar pรฅ att betalningsgatewayen ska visas kan POM-metodens namn vara waitForPaymentScreenDisplay().

Viktiga komponenter i sidobjektmodellen

  • Sidklasser: Representera varje webbsida som en separat klass.
  • Lokaliseringsstรคllen: Identifiera webbelement med hjรคlp av ID:n, XPaths eller CSS-vรคljare.
  • Metoder: Innehรฅller รฅtgรคrder eller operationer som utfรถrs pรฅ .page-elementen.
  • ร…teranvรคndbarhet: Promoรฅteranvรคndning av tes-kod och enklare underhรฅll รถver tester.
  • Dela upp problemen: Hรฅller sidstrukturen oberoende av testlogik fรถr bรคttre organisation.

Sidobjektmodell

Varfรถr Page Object Model?

Starta en UI-automation i Selenium webbdrivrutin รคr INTE en svรฅr uppgift. Du behรถver bara hitta element och utfรถra operationer pรฅ dem.

Tรคnk pรฅ det hรคr enkla skriptet fรถr att logga in pรฅ en webbplats.

Sidobjektmodell

Som du kan se รคr allt vi gรถr att hitta element och fylla i vรคrden fรถr dessa element.

Detta รคr ett tidskrรคvande skript som รคr felbenรคget. Det verkar enkelt till en bรถrjan, men allt eftersom testsviten expanderar blir det svรฅrt att hantera elementรคndringar. Men med tiden kommer testsviten att vรคxa. Allt eftersom du lรคgger till fler och fler rader i din kod blir det svรฅrare.

Det stรถrsta problemet med skriptunderhรฅll รคr att om 10 olika skript anvรคnder samma sidelement, med nรฅgon รคndring i det elementet, mรฅste du รคndra alla 10 skript. Detta รคr tidskrรคvande och felbenรคget.

Ett bรคttre sรคtt att hantera skript รคr att skapa en separat klassfil som hittar webbelement, fyller i dem eller verifierar dem. Denna klass kan sedan รฅteranvรคndas i flera testskript som interagerar med samma element. Om det i framtiden sker en รคndring i webbelementet behรถver vi gรถra รคndringen i bara en klassfil och inte 10 olika skript.

Detta tillvรคgagรฅngssรคtt kallas Page Object Model i SeleniumDet hjรคlper till att gรถra koden mer lรคsbar, lรคttare att underhรฅlla och รฅteranvรคndbar.

 Sidobjektmodell

๐Ÿ‘‰ Registrera dig fรถr gratis livesรคndning Selenium Projekt

Fรถrdelar med POM

  1. Page Object Design Pattern sรคger att operationer och flรถden i anvรคndargrรคnssnittet bรถr separeras frรฅn verifiering. Detta koncept gรถr vรฅr kod renare och lรคtt att fรถrstรฅ.
  2. Den andra fรถrdelen รคr att objektfรถrrรฅdet รคr oberoende av testfall, sรฅ vi kan anvรคnda samma objektfรถrrรฅd fรถr olika รคndamรฅl med olika verktyg. Till exempel kan vi integrera Page Object Model i Selenium med TestNG/JUnit fรถr funktionell Testning och samtidigt med JBehave/Cucumber fรถr acceptanstestning.
  3. Code blir mindre och optimerad eftersom den รฅteranvรคnder sidmetoder i POM-klasserna.
  4. Metoder fรฅr mer realistiska namn som enkelt kan mappas till den operation som sker i anvรคndargrรคnssnittet. Dvs. om vi landar pรฅ hemsidan efter att ha klickat pรฅ knappen kommer metodnamnet att se ut som 'gotoHomePage()'.

Hur man implementerar POM i Selenium?

Enkel PLog i den grundlรคggande strukturen fรถr ett Page Object Model-ramverk, dรคr whereManagereIDE-elementen fรถr AUT och metoderna som fungerar pรฅ dessa webbelement lagras i en blockeringsfil. En uppgift som verifiering bรถr vara separat som en del av testmetoderna.

Implementera POM

Komplett exempel

Testfall: Gรฅ till Guru99 Demosida.

Steg 1) Gรฅ till Guru99 Demosida

Implementera POM

Steg 2) Kontrollera pรฅ startsidan att texten "Guru99 Bankโ€ รคr nรคrvarande

Implementera POM

Steg 3) Logga in i applikationen

Implementera POM

Steg 4) Kontrollera att hemsidan innehรฅller text som "Manager Id: demo"

Implementera POM

I det hรคr exemplet har vi tvรฅ sidor att gรถra:

  1. Logga sidan
  2. Hemsida (visas nรคr du loggar in)

Fรถljaktligen skapar vi 2 POM in Selenium klasser

Guru99 Inloggningssida 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 Hemsida 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 Testfall

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

Vad รคr Page Factory i Selenium?

Page Factory i Selenium รคr ett inbyggt Page Object Model-ramverkskoncept fรถr Selenium WebDriver som fรถrbรคttrar underhรฅllsvรคnligheten genom att minska repetitiva elementsรถkningar med hjรคlp av annoteringar, inte genom exekveringshastighet. Den anvรคnds fรถr initiering av Page-objekt eller fรถr att instansiera sjรคlva Page-objektet. Den anvรคnds ocksรฅ fรถr att initiera Page-klasselement utan att anvรคnda "FindElement/s".

ร„ven hรคr fรถljer vi konceptet med separation av Page Object Repository och testmetoder. Dessutom med hjรคlp av klassen PageFactory i Selenium, vi anvรคnder anteckningar @FindBy fรถr att hitta WebElement. Vi anvรคnder initElements-metoden fรถr att initiera webbelement.

Page Factory In Selenium

@FindBy kan acceptera tagName, partialLinkText, name, linkText, id, css, className, xpath som attribut.

Lรฅt oss titta pรฅ samma exempel som ovan med Page Factory

Guru99 Inloggningssida 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 Hemsida 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-konceptet

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 projektstruktur kommer att se ut som i diagrammet:

Page Factory i Selenium

AjaxElementLocatorFactory

AjaxElementLocatorFactory รคr ett lat laddningskoncept av PageFactory i SeleniumDen anvรคnds fรถr att hitta webbelementen endast nรคr elementen anvรคnds i nรฅgon operation. Den tilldelar en timeout fรถr WebElements till objektets sidklassen. En av de viktigaste fรถrdelarna med att anvรคnda PageFactory-mรถnstret i Selenium รคr AjaxElementLocatorFactory Class.

Hรคr, nรคr en operation utfรถrs pรฅ ett element, bรถrjar vรคntetiden pรฅ dess synlighet fรถrst frรฅn det รถgonblicket. Om elementet inte hittas inom det angivna tidsintervallet, Testfall exekvering kommer att kasta 'NoSuchElementException' undantag.

AjaxElement Locator Factory

Till exempel:

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

ladda ner Selenium Projektfiler fรถr demon i denna handledning

Vanliga frรฅgor

Sidobjektmodellen รคr ett designmรถnster som abstracts webbsideselement i separata klasser. Det fรถrenklar automatisering genom att separera UI-interaktioner frรฅn testlogik, vilket frรคmjar tydlighet, skalbarhet och minskad kodduplicering.

In Selenium, POM representerar varje webbsida som en dedikerad klass som innehรฅller sรถkare och รฅtgรคrder. Den inkapslar UI-element, vilket gรถr att testskript kan fรถrbli oberoende av รคndringar i den underliggande sidstrukturen.

POM รคr inte ett fristรฅende ramverk utan ett designmรถnster. Det kan integreras i vilket automatiseringsramverk som helst fรถr att strukturera tester effektivt, vilket sรคkerstรคller bรคttre organisation, รฅteranvรคndbarhet och underhรฅllbarhet.

POM รคr en designprincip dรคr varje webbsida modelleras som en klass med definierade positioner och metoder. Den frikopplar testlogik frรฅn UI-element, vilket fรถrbรคttrar lรคsbarhet, skalbarhet och lรฅngsiktigt underhรฅll.

POM definierar designstrukturen fรถr sidabstraction, medan Page Factory tillhandahรฅller annoteringar och metoder (@FindBy) fรถr att effektivt initialisera webbelement. Page Factory รคr en implementeringsfรถrbรคttring av POM.

POM centraliserar elementsรถkare och sidรฅtgรคrder inom dedikerade klasser. Alla UI-modifieringar krรคver uppdateringar pรฅ endast ett stรคlle, vilket minimerar omarbetning, fรถrbรคttrar รฅteranvรคndning av kod och accelererar testunderhรฅll.

Ja. AI-drivna testgeneratorer kan skapa POM-klasser automatiskt genom att analysera UI-hierarkier, bibehรฅlla logisk separation av problem samtidigt som de accelererar skapandet av heltรคckande tester.

POM frรคmjar modulรคra och รฅteranvรคndbara testkomponenter, vilket mรถjliggรถr integration med AI-baserade testunderhรฅllsverktyg som automatiskt uppdaterar sรถkare, vilket minskar skriptbrรคcklighet och underhรฅllskostnader.

Sammanfatta detta inlรคgg med: