Hva er Page Object Model?
Page Object Model (POM) er et designmønster, populært brukt i testautomatisering som skaper Object Repository for web-UI-elementer. Fordelen med modellen er at den reduserer duplisering av kode og forbedrer testvedlikeholdet.
Under denne modellen, for hver webside i applikasjonen, bør det være en tilsvarende sideklasse. Denne sideklassen vil identifisere WebElements på den nettsiden og inneholder også sidemetoder som utfører operasjoner på disse WebElements. Navnet på disse metodene skal oppgis i henhold til oppgaven de utfører, dvs. hvis en laster venter på at betalingsporten skal vises, kan navnet på POM-metoden være waitForPaymentScreenDisplay ().
I denne veiledningen vil du lære-
- Hvorfor sideobjektmodell?
- Fordeler med POM
- Hvordan implementere POM?
- Hva er Page Factory?
- Guru99 TestCase med Page Factory-konsept
- AjaxElementLocatorFactory
Hvorfor sideobjektmodell?
Å starte en UI-automatisering i Selenium WebDriver er IKKE en tøff oppgave. Du trenger bare å finne elementer, utføre operasjoner på det.
Vurder dette enkle skriptet for å logge inn på et nettsted
Som du kan se, er alt vi gjør å finne elementer og fylle verdier for disse elementene.
Dette er et lite manus. Skriptvedlikehold ser enkelt ut. Men med tiden vil testpakken vokse. Når du legger til flere og flere linjer i koden din, blir ting tøffe.
Hovedproblemet med skriptvedlikehold er at hvis 10 forskjellige skript bruker det samme sideelementet, med noen endring i det elementet, må du endre alle de 10 skriptene. Dette er tidkrevende og feil utsatt.
En bedre tilnærming til skriptvedlikehold er å lage en egen klassefil som finner webelementer, fyller dem eller verifiserer dem. Denne klassen kan brukes på nytt i alle manusene ved hjelp av dette elementet. I fremtiden, hvis det er en endring i webelementet, må vi gjøre endringen i bare en klassefil og ikke 10 forskjellige skript.
Denne tilnærmingen kalles Page Object Model in Selenium. Det hjelper med å gjøre koden mer lesbar, vedlikeholdbar og gjenbrukbar.
Fordeler med POM
- Sideobjektdesignmønster sier at operasjoner og flyter i brukergrensesnittet skal skilles fra bekreftelse. Dette konseptet gjør koden vår renere og lett å forstå.
- Den andre fordelen er at objektregisteret er uavhengig av testtilfeller, så vi kan bruke det samme objektlageret til et annet formål med forskjellige verktøy. For eksempel kan vi integrere Page Object Model i Selen med TestNG / JUnit for funksjonell testing og samtidig med JBehave / Cucumber for akseptanstesting.
- Koden blir mindre og optimalisert på grunn av de gjenbrukbare sidemetodene i POM-klassene.
- Metoder får mer realistiske navn som enkelt kan kartlegges med operasjonen som skjer i brukergrensesnittet. dvs. hvis vi etter å ha klikket på knappen vi lander på hjemmesiden, vil metodenavnet være som 'gotoHomePage ()'.
Hvordan implementere POM?
Enkel POM:
Det er den grunnleggende strukturen i Page object model framework der alle webelementer i AUT og metoden som fungerer på disse webelementene blir opprettholdt i en klassefil. En oppgave som verifisering bør være atskilt som en del av testmetodene.
Komplett eksempel
TestCase: Gå til Guru99 Demo Site.
Trinn 1) Gå til Guru99 Demo Site | |
Trinn 2) På hjemmesiden er sjekketeksten "Guru99 Bank" til stede | |
Trinn 3) Logg inn på applikasjonen | |
Trinn 4) Bekreft at hjemmesiden inneholder tekst som "Manger Id: demo" |
Her har vi å gjøre med to sider
- Påloggingsside
- Hjemmeside (vises når du logger inn)
Følgelig lager vi 2 POM i Selenium-klasser
Guru99 Påloggingsside POM
pakke sider;importer org.openqa.selenium.By;importer org.openqa.selenium.WebDriver;offentlig klasse Guru99Login {WebDriver driver;Av user99GuruName = By.name ("uid");By password99Guru = By.name ("passord");Etter titleText = By.className ("barone");Ved pålogging = By.name ("btnLogin");offentlig Guru99Login (WebDriver driver) {this.driver = driver;}// Sett brukernavn i tekstbokspublic void setUserName (String strUserName) {driver.findElement (user99GuruName) .sendKeys (strUserName);}// Sett passord i passordtekstboksenpublic void setPassword (String strPassword) {driver.findElement (password99Guru) .sendKeys (strPassword);}// Klikk på påloggingsknappenpublic void clickLogin () {driver.findElement (innlogging). klikk ();}// Få tittelen på innloggingssidenoffentlig streng getLoginTitle () {return driver.findElement (titleText) .getText ();}/ *** Denne POM-metoden blir i test tilfelle utsatt for innlogging i applikasjonen* @param strUserName* @param strPasword* @komme tilbake* /public void loginToGuru99 (String strUserName, String strPasword) {// Fyll brukernavnthis.setUserName (strUserName);// Fyll passordthis.setPassword (strPasword);// Klikk på Logg inn-knappenthis.clickLogin ();}}
Guru99 Hjemmeside POM i selen
pakke sider;importer org.openqa.selenium.By;importer org.openqa.selenium.WebDriver;offentlig klasse Guru99HomePage {WebDriver driver;Av homePageUserName = By.xpath ("// tabell // tr [@ class = 'heading3']");offentlig Guru99HomePage (WebDriver-driver) {this.driver = driver;}// Få brukernavnet fra hjemmesidenoffentlig streng getHomePageDashboardUserName () {return driver.findElement (homePageUserName) .getText ();}}
Guru99 Simple POM i Selenium Test case
pakke test;importere java.util.concurrent.TimeUnit;importer org.openqa.selenium.WebDriver;importer org.openqa.selenium.firefox.FirefoxDriver;importer org.testng.Assert;importer org.testng.annotations.BeforeTest;importer org.testng.annotations.Test;importer sider. Guru99HomePage;importer sider.Guru99Login;offentlig klasse Test99GuruLogin {Streng driverPath = "C: \\ geckodriver.exe";WebDriver driver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestoffentlig ugyldig oppsett () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = ny FirefoxDriver ();driver.manage (). timeouts (). implicitly Waait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** Denne testsaken vil logge inn på http://demo.guru99.com/V4/* Bekreft tittelen på innloggingssiden som guru99-bank* Logg inn på søknaden* Bekreft hjemmesiden ved hjelp av Dashboard-meldingen* /@Test (prioritet = 0)offentlig ugyldig test_Home_Page_Appear_Correct () {// Opprett påloggingssideobjektobjLogin = ny Guru99Login (driver);// Bekreft tittelen på innloggingssidenStreng loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Inneholder ("guru99 bank"));// pålogging til applikasjonobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// gå neste sideobjHomePage = ny Guru99HomePage (driver);// Bekreft hjemmesidenAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Inneholder ("krybbe-id: mgr123"));}
Hva er sidefabrikk i selen?
Page Factory in Selenium er et innebygd rammekonsept for Page Object Model for Selenium WebDriver, men det er veldig optimalisert. Den brukes til initialisering av sideobjekter eller for å instantiere selve sideobjektet. Den brukes også til å initialisere sideklasseelementer uten å bruke "FindElement / s."
Også her følger vi begrepet separasjon av Page Object Repository og Test Methods. I tillegg bruker vi kommentarer @FindBy for å finne WebElement ved hjelp av klasse PageFactory i Selen . Vi bruker initElements-metoden for å initialisere webelementer
@FindBy kan godta tagName, partialLinkText, name, linkText, id, css, className, xpath som attributter.
La oss se på det samme eksemplet som ovenfor ved hjelp av Page Factory
Guru99 Påloggingsside med Page Factory
pakke PageFactory;importer org.openqa.selenium.WebDriver;importer org.openqa.selenium.WebElement;importer org.openqa.selenium.support.FindBy;importer org.openqa.selenium.support.PageFactory;offentlig klasse Guru99Login {/ *** Alle WebElements er identifisert av @FindBy-merknaden* /WebDriver driver;@FindBy (name = "uid")WebElement bruker99GuruName;@FindBy (name = "passord")WebElement-passord99Guru;@FindBy (className = "barone")WebElement titleText;@FindBy (name = "btnLogin")WebElement pålogging;offentlig Guru99Login (WebDriver driver) {this.driver = driver;// Denne initElements-metoden vil opprette alle WebElementsPageFactory.initElements (driver, dette);}// Sett brukernavn i tekstbokspublic void setUserName (String strUserName) {user99GuruName.sendKeys (strUserName);}// Sett passord i passordtekstboksenpublic void setPassword (String strPassword) {password99Guru.sendKeys (strPassword);}// Klikk på påloggingsknappenpublic void clickLogin () {login.click ();}// Få tittelen på innloggingssidenoffentlig streng getLoginTitle () {returner titleText.getText ();}/ *** Denne POM-metoden blir i test tilfelle utsatt for innlogging i applikasjonen* @param strUserName* @param strPasword* @komme tilbake* /public void loginToGuru99 (String strUserName, String strPasword) {// Fyll brukernavnthis.setUserName (strUserName);// Fyll passordthis.setPassword (strPasword);// Klikk på Logg inn-knappenthis.clickLogin ();}}
Guru99 Hjemmeside med Sidefabrikk
pakke PageFactory;importer org.openqa.selenium.WebDriver;importer org.openqa.selenium.WebElement;importer org.openqa.selenium.support.FindBy;importer org.openqa.selenium.support.PageFactory;offentlig klasse Guru99HomePage {WebDriver driver;@FindBy (xpath = "// tabell // tr [@ class = 'heading3']")WebElement homePageUserName;offentlig Guru99HomePage (WebDriver-driver) {this.driver = driver;// Denne initElements-metoden vil opprette alle WebElementsPageFactory.initElements (driver, dette);}// Få brukernavnet fra hjemmesidenoffentlig streng getHomePageDashboardUserName () {returner homePageUserName.getText ();}}
Guru99 TestCase med Page Factory-konsept
pakke test;importere java.util.concurrent.TimeUnit;importer org.openqa.selenium.WebDriver;importer org.openqa.selenium.firefox.FirefoxDriver;importer org.testng.Assert;importer org.testng.annotations.BeforeTest;importer org.testng.annotations.Test;importere PageFactory.Guru99HomePage;importere PageFactory.Guru99Login;offentlig klasse Test99GuruLoginWithPageFactory {Streng driverPath = "C: \\ geckodriver.exe";WebDriver driver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestoffentlig ugyldig oppsett () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = ny FirefoxDriver ();driver.manage (). timeouts (). implicitly Waait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** Denne testen går til http://demo.guru99.com/V4/* Bekreft tittelen på innloggingssiden som guru99-bank* Logg inn på søknaden* Bekreft hjemmesiden ved hjelp av Dashboard-meldingen* /@Test (prioritet = 0)offentlig ugyldig test_Home_Page_Appear_Correct () {// Opprett påloggingssideobjektobjLogin = ny Guru99Login (driver);// Bekreft tittelen på innloggingssidenStreng loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Inneholder ("guru99 bank"));// pålogging til applikasjonobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// gå neste sideobjHomePage = ny Guru99HomePage (driver);// Bekreft hjemmesidenAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Inneholder ("krybbe-id: mgr123"));}}
Komplett prosjektstruktur vil se ut som diagrammet:
AjaxElementLocatorFactory
AjaxElementLocatorFactory er et lat lastekonsept for PageFactory i Selen. Den brukes til å finne nettelementene bare når elementene brukes i en hvilken som helst operasjon. Det tildeler en timeout for WebElements til objektsideklassen. En av de viktigste fordelene ved å bruke mønsteret PageFactory i Selen er AjaxElementLocatorFactory Class.
Her, når en operasjon utføres på et element, starter ventetiden på synligheten bare fra det øyeblikket. Hvis elementet ikke blir funnet i det gitte tidsintervallet, vil eksekvering av Test Case kaste unntak fra NoSuchElementException.
Sammendrag
- Page Object Model i Selenium Websdriver er et mønster for Object Repository-design.
- Selen-objekt-modell oppretter testkoden vår som kan vedlikeholdes, gjenbrukes.
- Page Factory er en optimalisert måte å lage objektlager i Page Object Model-rammekonseptet.
- AjaxElementLocatorFactory er et lat belastningskonsept i Page Factory - design av mønster for sideobjekter for å identifisere WebElements bare når de brukes i en hvilken som helst operasjon.
Last ned Selenium Project Files for Demo i denne veiledningen