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.

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.
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.
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.
๐ Registrera dig fรถr gratis livesรคndning Selenium Projekt
Fรถrdelar med POM
- 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รฅ.
- 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.
- Code blir mindre och optimerad eftersom den รฅteranvรคnder sidmetoder i POM-klasserna.
- 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.
Komplett exempel
Testfall: Gรฅ till Guru99 Demosida.
Steg 1) Gรฅ till Guru99 Demosida
Steg 2) Kontrollera pรฅ startsidan att texten "Guru99 Bankโ รคr nรคrvarande
Steg 3) Logga in i applikationen
Steg 4) Kontrollera att hemsidan innehรฅller text som "Manager Id: demo"
I det hรคr exemplet har vi tvรฅ sidor att gรถra:
- Logga sidan
- 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.
@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:
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.
Till exempel:
AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10); PageFactory.initElements(factory, this);
ladda ner Selenium Projektfiler fรถr demon i denna handledning











