Page Object Model Framework med Java og WebDriver

Denne opplæringen er den andre delen av utviklingen av Test Automation Framework.

I den første delen lærte vi hvordan vi kan lage strukturen i rammeverket fra bunnen av.

I denne opplæringen skal vi lage basisklassene for rammeverket.


Merk:Hvis du ikke har lest del 1 av denne opplæringen, kan du følge instruksjonene på Hvordan lage et testautomatiseringsrammeverk fra bunnen av .

Alternativt kan du klone baserammen fra min GitHub repo .

Når du har fulgt instruksjonene på del 1 av denne opplæringen eller klonet repoen, bør du ha disse fire Maven-modulene:


  • domene - klasser som beskriver forretningsmodellen
  • rammeverk - kjerneklasser som danner rammen
  • side-objekter - komponenter og lokaliseringer på hver webside
  • regresjonstester - faktiske testklasser som er avhengige av sideobjekter

Rammeverket vårt vil være basert på designmønsteret for Page Object Model. Vi vil også bruke WebDriver PageFactory klasse for å initialisere WebElements.



Selen-side-objektmodell

Nå, nå som du har opprettet basestrukturen, la oss starte med å legge til basisklassene.

BasePage.java

I rammeverk modul, lager vi en klasse som heter BasePage.java. Alle sideobjektklasser utvider BasePage, og arver dermed alle basemetodene.

BasePage-klassen vår vil ha en konstruktør som tar et WebDriver-objekt for å initialisere et WebDriverWait-objekt. Konstruktøren vil også være ansvarlig for å initialisere WebElements via PageFactory.


I tillegg vil vi også ha noen ventemetoder for verktøy for å håndtere de forskjellige ventene som WaitForElementToAppear.

Så BasePage-klassen vil 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)));
} }
Merk:I BasePage-klassen initialiserer vi ikke WebDriver-objektet. Initialiseringen gjøres i BaseTest-klassen.

BaseTest.java

BaseTest-klassen inneholder metodene for å initialisere og avslutte WebDriver-objektet. Siden alle testklassene utvider BaseTest-klassen, gjøres initialiseringen implisitt. Testklassene får ganske enkelt WebDriver-objektet ved å ringe getDriver() metode.

Når vi bruker TestNG, kan vi også bruke @BeforeSuite og @AfterSuite kommentarer, for eksempel:


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;
} }


Legge til sideobjektene

Nå, i side-objekter modul oppretter vi vårt første sideobjekt. For denne opplæringen vil jeg bruke Googles hjemmeside.

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, gjør ikke dette sideobjektet mye. Den har bare en konstruktør som tar et WebDriver-objekt og overfører det til superklassekonstruktøren.

Igjen, merk at ingen av sideobjektene eller BasePage initialiserer WebDriver-objektene.

I del 3 av denne opplæringen vil vi legge til metodene for å håndtere søkefunksjonen på Googles hjemmeside.




Legge til testene

Vi legger til testene i regresjonstester modul.

Vi oppretter en testklasse kalt GoogleHomepageTests, med en testmetode som bare instantierer GoogleHomepage-sideobjektet. Foreløpig gjør det ingen andre handlinger.

I del 3 av denne opplæringen vil jeg legge til metodene for å søke og verifisere resultatene.

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 kjører testen ovenfor i IDE, bør du se en Google Chrome-nettleser åpne og lukke.


Følg med for del 3 av denne opplæringen, der jeg tar eksemplet ovenfor videre ved å legge til flere komponenter for å utvide rammeverket.

Du kan få alle ovennevnte kildekoder fra GitHub repo . Håper du fant den ovennevnte WebDriver Framework-opplæringen nyttig.

Videre lesning: