Framework de models d'objectes de pàgina amb Java i WebDriver

Aquest tutorial és la segona part del desenvolupament del Test Automation Framework.

A la primera part, vam aprendre a crear l’estructura del marc des de zero.

En aquest tutorial, crearem les classes base per al framework.


Nota:Si no heu llegit la part 1 d’aquest tutorial, seguiu les instruccions de Com es crea un marc d’automatització de proves des de Scratch .

Com a alternativa, podeu clonar el marc base des del meu fitxer Reposició de GitHub .

Un cop hàgiu seguit les instruccions de la primera part d’aquest tutorial o hagis clonat el repo, hauríeu de tenir aquests quatre mòduls Maven:


  • domini - classes que descriuen el model de negoci
  • marc - classes bàsiques que formen el marc
  • objectes-pàgina - components i localitzadors de cada pàgina web
  • proves de regressió - classes de proves reals que es basen en objectes de pàgina

El nostre marc es basarà en el patró de disseny del model d'objectes de pàgina. També utilitzarem el WebDriver PageFactory classe per inicialitzar WebElements.





Model d'objectes de pàgina de seleni

D’acord, ara que heu creat l’estructura base, comencem afegint les classes base.

BasePage.java

A la marc mòdul, creem una classe anomenada BasePage.java. Totes les classes d'objectes de pàgina ampliaran la BasePage, heretant així tots els mètodes base.

La nostra classe BasePage tindrà un constructor que necessita un objecte WebDriver per inicialitzar un objecte WebDriverWait. El constructor també serà responsable d'inicialitzar WebElements mitjançant PageFactory.


A més, també tindrem alguns mètodes d’espera d’utilitat per gestionar les diverses esperes, com ara WaitForElementToAppear.

Per tant, la classe BasePage tindrà el següent aspecte:

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)));
} }
Nota:A la classe BasePage no inicialitzem l'objecte WebDriver. La inicialització es fa a la classe BaseTest.

BaseTest.java

La classe BaseTest conté els mètodes per inicialitzar i finalitzar l'objecte WebDriver. Com que totes les classes de prova ampliaran la classe BaseTest, la inicialització es fa implícitament. Les classes de prova simplement obtindran l'objecte WebDriver trucant al getDriver() mètode.

A més, com que fem servir TestNG, podem utilitzar el @BeforeSuite i @AfterSuite anotacions, com ara:


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


Afegir els objectes de pàgina

Ara, al objectes-pàgina mòdul, creem el nostre primer objecte de pàgina. Per a aquest tutorial, utilitzaré la pàgina d'inici de Google.

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

Com podeu veure, aquest objecte de pàgina no fa gaire. Només té un constructor que agafa un objecte WebDriver i el transmet al seu constructor de superclasse.

Una vegada més, tingueu en compte que cap dels objectes de pàgina ni el BasePage inicialitzen els objectes WebDriver.

A la part 3 d’aquest tutorial, afegirem els mètodes per gestionar la funció de cerca de la pàgina inicial de Google.




Afegir les proves

Afegim les proves al fitxer proves de regressió mòdul.

Creem una classe de prova anomenada GoogleHomepageTests, amb un mètode de prova que només instancia el nostre objecte de pàgina de GoogleHomepage. De moment, no fa cap altra acció.

A la part 3 d’aquest tutorial, afegiré els mètodes per cercar i verificar els resultats.

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

Quan feu la prova anterior al vostre IDE, hauríeu de veure obrir i tancar un navegador Google Chrome.


Estigueu atents a la part 3 d’aquest tutorial, on seguiré l’exemple anterior afegint més components per ampliar el marc.

Podeu obtenir tot el codi font anterior a la pàgina Reposició de GitHub . Espero que us hagi estat útil el tutorial de WebDriver Framework anterior.

Per llegir més: