Vad är Page Object Model?
Page Object Model (POM) är ett designmönster som ofta används i testautomation som skapar Object Repository för webbgränssnittselement. Fördelen med modellen är att den minskar duplicering av kod och förbättrar testunderhållet.
Enligt denna modell bör det finnas en motsvarande sidklass för varje webbsida i applikationen. Denna sidklass kommer att identifiera WebElements för den webbsidan och innehåller även sidmetoder som utför åtgärder på dessa WebElements. Namnet på dessa metoder ska anges enligt uppgiften de utför, dvs. om en lastare väntar på att betalningsgatewayen ska visas kan namnet POM-metod vara waitForPaymentScreenDisplay ().
I den här handledningen lär du dig-
- Varför modell för sidobjekt?
- Fördelar med POM
- Hur implementerar jag POM?
- Vad är Page Factory?
- Guru99 TestCase med konceptet Page Factory
- AjaxElementLocatorFactory
Varför modell för sidobjekt?
Att starta en UI-automatisering i Selen WebDriver är INTE en tuff uppgift. Du behöver bara hitta element, utföra operationer på det.
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 värden för dessa element.
Detta är ett litet manus. Skriptunderhåll ser enkelt ut. Men med tiden kommer testpaketet att växa. När du lägger till fler och fler rader i din kod blir det tufft.
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ägen.
Ett bättre tillvägagångssätt för skriptunderhåll är att skapa en separat klassfil som hittar webbelement, fyller dem eller verifierar dem. Denna klass kan återanvändas i alla skript med det elementet. I framtiden, om det finns en förändring i webbelementet, måste vi göra ändringen i bara en klassfil och inte 10 olika skript.
Detta tillvägagångssätt kallas Page Object Model in Selenium. Det hjälper till att göra koden mer läsbar, underhållbar och återanvändbar.
Fördelar med POM
- Sidobjektdesignmönster säger att operationer och flöden i användargränssnittet ska skiljas från verifiering. Detta koncept gör vår kod renare och lätt att förstå.
- Den andra fördelen är att objektförvaret är oberoende av testfall, så vi kan använda samma objektförvar för ett annat syfte med olika verktyg. Till exempel kan vi integrera Page Object Model i Selen med TestNG / JUnit för funktionell testning och samtidigt med JBehave / Cucumber för acceptans testning.
- Koden blir mindre och optimerad på grund av de återanvändbara sidmetoderna i POM-klasserna.
- Metoder får mer realistiska namn som enkelt kan kartläggas med operationen som sker i användargränssnittet. dvs om efter att ha klickat på knappen vi landar på hemsidan kommer metodnamnet att vara som 'gotoHomePage ()'.
Hur implementerar jag POM?
Enkel POM:
Det är den grundläggande strukturen i Page-objektmodellramen där alla webbelement i AUT och metoden som fungerar på dessa webbelement bibehålls i en klassfil. En uppgift som verifiering bör vara separat som en del av testmetoder.
Komplett exempel
TestCase: Gå till Guru99 Demo Site.
Steg 1) Gå till Guru99 Demo Site | |
Steg 2) På hemsidan är rutan "Guru99 Bank" närvarande | |
Steg 3) Logga in i ansökan | |
Steg 4) Kontrollera att startsidan innehåller text som "Manger Id: demo" |
Här har vi 2 sidor att göra
- Login sida
- Hemsida (visas när du loggar in)
Följaktligen skapar vi 2 POM i selenklasser
Guru99 Inloggningssida POM
paket sidor;importera org.openqa.selenium.By;importera org.openqa.selenium.WebDriver;offentlig klass Guru99Login {WebDriver-drivrutin;Av user99GuruName = By.name ("uid");By password99Guru = By.name ("lösenord");Efter titleText = By.className ("barone");Genom inloggning = By.name ("btnLogin");offentlig Guru99Login (WebDriver-drivrutin) {this.driver = driver;}// Ställ in användarnamn i textrutanpublic void setUserName (String strUserName) {driver.findElement (user99GuruName) .sendKeys (strUserName);}// Ställ in lösenord i lösenordets textrutapublic void setPassword (String strPassword) {driver.findElement (password99Guru) .sendKeys (strPassword);}// Klicka på inloggningsknappenpublic void clickLogin () {driver.findElement (inloggning) .klicka ();}// Få titeln på inloggningssidanpublic String getLoginTitle () {return driver.findElement (titleText) .getText ();}/ *** Denna POM-metod exponeras i testfallet för inloggning i applikationen* @param strUserName* @param strPasword* @lämna tillbaka* /public void loginToGuru99 (String strUserName, String strPasword) {// Fyll i användarnamnthis.setUserName (strUserName);// Fyll lösenordthis.setPassword (strPasword);// Klicka på inloggningsknappenthis.clickLogin ();}}
Guru99 hemsida POM i selen
paket sidor;importera org.openqa.selenium.By;importera org.openqa.selenium.WebDriver;offentlig klass Guru99HomePage {WebDriver-drivrutin;Av homePageUserName = By.xpath ("// tabell // tr [@ class = 'heading3']");offentlig Guru99HomePage (WebDriver-drivrutin) {this.driver = driver;}// Hämta användarnamnet från hemsidanoffentlig sträng getHomePageDashboardUserName () {returnera driver.findElement (homePageUserName) .getText ();}}
Guru99 enkel POM i selen testfall
paketprov;importera java.util.concurrent.TimeUnit;importera org.openqa.selenium.WebDriver;importera org.openqa.selenium.firefox.FirefoxDriver;importera org.testng.Assert;importera org.testng.annotations.BeforeTest;importera org.testng.annotations.Test;importera sidor.Guru99HomePage;importera sidor.Guru99Login;offentlig klass Test99GuruLogin {Sträng driverPath = "C: \\ geckodriver.exe";WebDriver-drivrutin;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestoffentlig tomrumsinställning () {System.setProperty ("webdriver.gecko.driver", driverPath);drivrutin = ny FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** Detta testfall loggar in på http://demo.guru99.com/V4/* Verifiera inloggningssidans titel som guru99 bank* Logga in på ansökan* Verifiera startsidan med Dashboard-meddelandet* /@Test (prioritet = 0)offentligt ogiltigt test_Home_Page_Appear_Correct () {// Skapa inloggningssida-objektobjLogin = ny Guru99Login (drivrutin);// Verifiera inloggningssidans titelSträng loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Innehåller ("guru99 bank"));// logga in på applikationenobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// gå till nästa sidaobjHomePage = ny Guru99HomePage (drivrutin);// Verifiera hemsidanAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Innehåller ("manger id: mgr123"));}
Vad är Page Factory i Selen?
Page Factory in Selenium är ett inbyggt ramkoncept för Page Object Model för Selenium WebDriver men det är mycket optimerat. Den används för initialisering av sidobjekt eller för att starta själva sidobjektet. Den används också för att initialisera sidklasselement utan att använda "FindElement / s."
Även här följer vi begreppet separation av Page Object Repository och Test Methods. Med hjälp av klassen PageFactory i Selen använder vi också kommentarer @FindBy för att hitta WebElement. Vi använder metoden initElements 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 hjälp av Page Factory
Inloggningssida för Guru99 med Page Factory
paketet PageFactory;importera org.openqa.selenium.WebDriver;importera org.openqa.selenium.WebElement;importera org.openqa.selenium.support.FindBy;importera org.openqa.selenium.support.PageFactory;offentlig klass Guru99Login {/ *** Alla WebElements identifieras av @FindBy-anteckningen* /WebDriver-drivrutin;@FindBy (namn = "uid")WebElement user99GuruName;@FindBy (namn = "lösenord")WebElement-lösenord99Guru;@FindBy (className = "barone")WebElement titleText;@FindBy (namn = "btnLogin")WebElement-inloggning;offentlig Guru99Login (WebDriver-drivrutin) {this.driver = driver;// Denna initElements-metod skapar alla WebElementsPageFactory.initElements (drivrutin, detta);}// Ställ in användarnamn i textrutanpublic void setUserName (String strUserName) {user99GuruName.sendKeys (strUserName);}// Ställ in lösenord i lösenordets textrutapublic void setPassword (String strPassword) {password99Guru.sendKeys (strPassword);}// Klicka på inloggningsknappenpublic void clickLogin () {login.click ();}// Få titeln på inloggningssidanpublic String getLoginTitle () {returnera titleText.getText ();}/ *** Denna POM-metod exponeras i testfallet för inloggning i applikationen* @param strUserName* @param strPasword* @lämna tillbaka* /public void loginToGuru99 (String strUserName, String strPasword) {// Fyll i användarnamnthis.setUserName (strUserName);// Fyll lösenordthis.setPassword (strPasword);// Klicka på inloggningsknappenthis.clickLogin ();}}
Guru99 hemsida med sidfabrik
paketet PageFactory;importera org.openqa.selenium.WebDriver;importera org.openqa.selenium.WebElement;importera org.openqa.selenium.support.FindBy;importera org.openqa.selenium.support.PageFactory;offentlig klass Guru99HomePage {WebDriver-drivrutin;@FindBy (xpath = "// tabell // tr [@ class = 'rubrik3']")WebElement homePageUserName;offentlig Guru99HomePage (WebDriver-drivrutin) {this.driver = driver;// Denna initElements-metod skapar alla WebElementsPageFactory.initElements (drivrutin, detta);}// Hämta användarnamnet från hemsidanoffentlig sträng getHomePageDashboardUserName () {returnera homePageUserName.getText ();}}
Guru99 TestCase med konceptet Page Factory
paketprov;importera java.util.concurrent.TimeUnit;importera org.openqa.selenium.WebDriver;importera org.openqa.selenium.firefox.FirefoxDriver;importera org.testng.Assert;importera org.testng.annotations.BeforeTest;importera org.testng.annotations.Test;importera PageFactory.Guru99HomePage;importera PageFactory.Guru99Login;offentlig klass Test99GuruLoginWithPageFactory {Sträng driverPath = "C: \\ geckodriver.exe";WebDriver-drivrutin;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestoffentlig tomrumsinställning () {System.setProperty ("webdriver.gecko.driver", driverPath);drivrutin = ny FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** Detta test går till http://demo.guru99.com/V4/* Verifiera inloggningssidans titel som guru99 bank* Logga in på ansökan* Verifiera startsidan med Dashboard-meddelandet* /@Test (prioritet = 0)offentligt ogiltigt test_Home_Page_Appear_Correct () {// Skapa inloggningssida-objektobjLogin = ny Guru99Login (drivrutin);// Verifiera inloggningssidans titelSträng loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Innehåller ("guru99 bank"));// logga in på applikationenobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// gå till nästa sidaobjHomePage = ny Guru99HomePage (drivrutin);// Verifiera hemsidanAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Innehåller ("manger id: mgr123"));}}
Komplett projektstruktur kommer att se ut som i diagrammet:
AjaxElementLocatorFactory
AjaxElementLocatorFactory är ett begrepp för lat laddning av PageFactory i Selen. Den används för att hitta webbelementen endast när elementen används i någon operation. Det tilldelar en timeout för WebElements till objektets sidklass. En av de viktigaste fördelarna med att använda mönstret PageFactory i selen är AjaxElementLocatorFactory Class.
Här, när en operation utförs på ett element, börjar väntan på dess synlighet bara från det ögonblicket. Om elementet inte hittas under det angivna tidsintervallet kommer testfallets utförande att kasta 'NoSuchElementException' undantag.
Sammanfattning
- Sidobjektmodellen i Selenium Websdriver är ett mönster för objektförvar.
- Selen-sidobjektmodellen skapar vår testkod som kan underhållas, återanvändas.
- Page Factory är ett optimerat sätt att skapa objektförvar i ramkonceptet Page Object Model.
- AjaxElementLocatorFactory är ett koncept för lat last i Page Factory - designmönster för sidobjekt för att identifiera WebElements bara när de används i någon operation.
Ladda ner Selenium-projektfilerna för demo i den här självstudien