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.

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.
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.
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.
๐ Meld deg pรฅ gratis live Selenium Prosjekt
Fordeler med POM
- 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รฅ.
- 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.
- Code blir mindre og optimalisert fordi den gjenbruker sidemetoder i POM-klassene.
- 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.
Komplett eksempel
Testforsรธk: Gรฅ til Guru99 Demoside.
Trinn 1) Gรฅ til Guru99 Demoside
Trinn 2) Pรฅ hjemmesiden, sjekk at teksten ยซGuruยซ99 Bankยป er til stede
Trinn 3) Logg pรฅ applikasjonen
Trinn 4) Bekreft at hjemmesiden inneholder tekst som "Manger Id: demo"
I dette eksemplet har vi รฅ gjรธre med to sider:
- Pรฅloggingssiden
- 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.
@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:
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.
For eksempel:
AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10); PageFactory.initElements(factory, this);
Last ned Selenium Prosjektfiler for demoen i denne opplรฆringen











