Структура объектной модели страницы с Java и WebDriver

Это руководство является второй частью разработки Test Automation Framework.

В первой части мы научились создавать структуру фреймворка с нуля.

В этом уроке мы собираемся создать базовые классы для фреймворка.

Примечание:Если вы не читали часть 1 этого руководства, следуйте инструкциям на Как создать среду автоматизации тестирования с нуля .

В качестве альтернативы вы можете клонировать базовый фреймворк из моего Репозиторий GitHub .

После того, как вы выполнили инструкции в части 1 этого руководства или клонировали репозиторий, у вас должны быть следующие четыре модуля Maven:

  • домен - классы, описывающие бизнес-модель
  • фреймворк - основные классы, составляющие основу
  • страницы-объекты - компоненты и локаторы каждой веб-страницы
  • регрессионные тесты - фактические тестовые классы, которые полагаются на объекты страницы

Наша структура будет основана на шаблоне проектирования объектной модели страницы. Мы также будем использовать WebDriver PageFactory класс для инициализации WebElements.



Объектная модель страницы Selenium

Хорошо, теперь, когда вы создали базовую структуру, давайте начнем с добавления базовых классов.

BasePage.java

в фреймворк модуль, мы создаем класс под названием BasePage.java. Все классы объектов страницы будут расширять BasePage, унаследовав, таким образом, все базовые методы.

Наш класс BasePage будет иметь конструктор, который принимает объект WebDriver для инициализации объекта WebDriverWait. Конструктор также будет отвечать за инициализацию WebElements через PageFactory.

Кроме того, у нас также будут некоторые служебные методы ожидания для обработки различных ожиданий, такие как WaitForElementToAppear.

Итак, класс BasePage будет выглядеть так:

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)));
} }
Примечание:В классе BasePage мы не инициализируем объект WebDriver. Инициализация выполняется в классе BaseTest.

BaseTest.java

Класс BaseTest содержит методы для инициализации и завершения объекта WebDriver. Поскольку все классы Test расширяют класс BaseTest, инициализация выполняется неявно. Классы Test просто получат объект WebDriver, вызвав getDriver() метод.

Кроме того, поскольку мы используем TestNG, мы можем использовать @BeforeSuite и @AfterSuite аннотации, например:

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

Добавление объектов страницы

Теперь в страницы-объекты модуль, мы создаем наш первый объект страницы. Для этого урока я буду использовать домашнюю страницу 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);
} }

Как видите, этот объект страницы ничего не делает. У него есть только конструктор, который принимает объект WebDriver и передает его конструктору своего суперкласса.

Опять же, обратите внимание, что ни объекты страницы, ни BasePage не инициализируют объекты WebDriver.

В части 3 этого руководства мы добавим методы для обработки функции поиска на главной странице Google.

Добавление тестов

Добавляем тесты в регрессионные тесты модуль.

Мы создаем тестовый класс под названием GoogleHomepageTests с одним тестовым методом, который просто создает экземпляр нашего объекта страницы GoogleHomepage. На данный момент он не выполняет никаких других действий.

В части 3 этого руководства я добавлю методы поиска и проверки результатов.

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

Когда вы запустите вышеуказанный тест в своей среде IDE, вы должны увидеть, как браузер Google Chrome открывается и закрывается.

Следите за обновлениями в части 3 этого руководства, где я продолжу приведенный выше пример, добавив дополнительные компоненты для расширения фреймворка.

Вы можете получить весь вышеперечисленный исходный код из Репозиторий GitHub . Надеюсь, вы нашли приведенное выше руководство по WebDriver Framework полезным.

Дальнейшее чтение: