Page Object Model Framework med Java och WebDriver

Den här handledningen är den andra delen av utvecklingen av Test Automation Framework.

I den första delen lärde vi oss att skapa ramstrukturen från grunden.

I den här handledningen ska vi skapa basklasserna för ramverket.

Notera:Om du inte har läst del 1 av denna handledning, följ instruktionerna på Hur man skapar ett testautomatiseringsramverk från grunden .

Alternativt kan du klona basramen från min GitHub repo .

När du har följt instruktionerna i del 1 i denna handledning eller klonat repo bör du ha dessa fyra Maven-moduler:

  • domän - klasser som beskriver affärsmodellen
  • ramverk - kärnklasser som utgör ramverket
  • sidobjekt - komponenter och lokalisatorer på varje webbsida
  • regressionstest - verkliga testklasser som är beroende av sidobjekt

Vårt ramverk kommer att baseras på designmönstret Page Object Model. Vi kommer också att använda WebDriver's PageFactory klass för att initiera WebElements.



Selen-sidobjektmodell

Ok, nu när du har skapat basstrukturen, låt oss börja med att lägga till basklasserna.

BasePage.java

I ramverk modul skapar vi en klass som heter BasePage.java. Alla sidobjektsklasser utvidgar BasePage, vilket ärver alla basmetoder.

Vår BasePage-klass kommer att ha en konstruktör som tar ett WebDriver-objekt för att initiera ett WebDriverWait-objekt. Konstruktören kommer också att ansvara för att initiera WebElements via PageFactory.

Dessutom kommer vi också att ha några verktyg för att vänta på verktyg för att hantera de olika väntningarna som WaitForElementToAppear.

Så BasPage-klassen kommer att se ut:

package rima.framework.core; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.support.PageFactory; import org.openqa.selenium.support.pagefactory.AjaxElementLocatorFactory; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; public class BasePage {
private static final int TIMEOUT = 5;
private static final int POLLING = 100;
protected WebDriver driver;
private WebDriverWait wait;
public BasePage(WebDriver driver) {
this.driver = driver;
wait = new WebDriverWait(driver, TIMEOUT, POLLING);
PageFactory.initElements(new AjaxElementLocatorFactory(driver, TIMEOUT), this);
}
protected void waitForElementToAppear(By locator) {
wait.until(ExpectedConditions.visibilityOfElementLocated(locator));
}
protected void waitForElementToDisappear(By locator) {
wait.until(ExpectedConditions.invisibilityOfElementLocated(locator));
}
protected void waitForTextToDisappear(By locator, String text) {
wait.until(ExpectedConditions.not(ExpectedConditions.textToBe(locator, text)));
} }
Notera:I BasePage-klassen initialiserar vi inte WebDriver-objektet. Initieringen görs i BaseTest-klassen.

BaseTest.java

BaseTest-klassen innehåller metoderna för att initiera och avsluta WebDriver-objektet. Eftersom alla testklasser utvidgar BaseTest-klassen görs initialiseringen implicit. Testklasserna hämtar helt enkelt WebDriver-objektet genom att anropa getDriver() metod.

När vi använder TestNG kan vi också använda @BeforeSuite och @AfterSuite anteckningar, såsom:

package rima.framework.core; import io.github.bonigarcia.wdm.ChromeDriverManager; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.testng.annotations.AfterSuite; import org.testng.annotations.BeforeSuite; public class BaseTest {
private WebDriver driver;
@BeforeSuite
public void beforeSuite() {
System.setProperty('headless', 'false'); // You can set this property elsewhere
String headless = System.getProperty('headless');

ChromeDriverManager.chromedriver();
if('true'.equals(headless)) {

ChromeOptions chromeOptions = new ChromeOptions();

chromeOptions.addArguments('--headless');

driver = new ChromeDriver(chromeOptions);
} else {

driver = new ChromeDriver();
}
}
@AfterSuite
public void afterSuite() {
if(null != driver) {

driver.close();

driver.quit();
}
}
public WebDriver getDriver() {
return driver;
} }

Lägga till sidobjekten

Nu, i sidobjekt modul skapar vi vårt första sidobjekt. För denna handledning använder jag Googles startsida.

package rima.pageobjects.homepage; import org.openqa.selenium.WebDriver; import rima.framework.core.BasePage; public class GoogleHomepage extends BasePage {
public GoogleHomepage(WebDriver driver) {
super(driver);
} }

Som du kan se gör det här sidobjektet inte mycket. Den har bara en konstruktör som tar ett WebDriver-objekt och skickar det vidare till sin superklasskonstruktör.

Observera igen att inget av sidobjekten eller BasePage initialiserar WebDriver-objekten.

I del 3 av denna handledning lägger vi till metoderna för att hantera sökfunktionen på Googles hemsida.

Lägga till testerna

Vi lägger till testerna i regressionstest modul.

Vi skapar en testklass som heter GoogleHomepageTests, med en testmetod som bara startar vårt GoogleHomepage-sidobjekt. För närvarande gör det ingen annan åtgärd.

I del 3 av denna handledning lägger jag till metoderna för att söka och verifiera resultaten.

package rima.tests.homepage; import org.testng.annotations.Test; import rima.framework.core.BaseTest; import rima.pageobjects.homepage.GoogleHomepage; public class GoogleHomepageTests extends BaseTest {
@Test
public void homepageTests() {
GoogleHomepage googleHomepage = new GoogleHomepage(getDriver());
} }

När du kör testet ovan i din IDE bör du se en webbläsare i Google Chrome öppna och stänga.

Håll ögonen öppna för del 3 i denna handledning där jag tar exemplet ovan genom att lägga till fler komponenter för att utöka ramverket.

Du kan hämta alla ovanstående källkoder från GitHub repo . Hoppas att du tyckte ovanstående handledning för WebDriver Framework användbar.

Vidare läsning: