Альтернативы Page Object в тестировании
🚀 В автоматизации тестирования важно организовать код так, чтобы он был простым для чтения, лёгким в поддержке и удобным для повторного использования. Для этого используются разные архитектурные подходы, такие как Page Object Model и его альтернативы.
Вот зачем они нужны и как их применять:
Почему хороша Page Object модель
- 📖 Читаемость: Код становится проще для восприятия благодаря структурированию логики страниц.
- ♻️ Повторное использование: Методы страниц можно использовать в разных тестах.
- 🛠️ Лёгкость поддержки: Обновления интерфейса требуют изменения только в Page Object классах.
- 🔒 Инкапсуляция: Локаторы и действия с ними скрыты внутри класса.
Пример:
public class LoginPage {
private WebDriver driver;
private By emailField = By.id("email");
private By loginButton = By.id("login-btn");
public LoginPage(WebDriver driver) {
this.driver = driver;
}
public void login(String email) {
driver.findElement(emailField).sendKeys(email);
driver.findElement(loginButton).click();
}
}
1. Screenplay Pattern
🎭 Фокус на действиях пользователя, а не на страницах.
Пример:
actor.attemptsTo(
Click.on(LoginPage.LOGIN_BUTTON),
Enter.theValue("user@example.com").into(LoginPage.EMAIL_FIELD)
);
Плюсы: читаемость, повторное использование. Минусы: сложность освоения.
2. UI Mapping
🗺️ Централизованный файл для хранения локаторов.
Пример:
Map<String, By> UI_MAP = Map.of(
"loginButton", By.id("login-btn"),
"emailField", By.id("email")
);
driver.findElement(UI_MAP.get("loginButton")).click();
Плюсы: простота реализации. Минусы: потеря структуры на больших проектах.
3. Component Object Model
🔧 Разбивка на компоненты (например, таблицы, выпадающие списки).
Пример:
public class Dropdown {
private WebElement dropdown;
public Dropdown(WebElement dropdown) {
this.dropdown = dropdown;
}
public void selectByValue(String value) {
new Select(dropdown).selectByValue(value);
}
}
Плюсы: удобство тестирования компонентов. Минусы: сложность интеграции.
Совмещение подходов
- Page Object + Component Object: Используйте компоненты внутри Page Object классов для упрощения работы с повторяющимися элементами.
- Page Object + UI Mapping: Локаторы из UI Mapping могут использоваться в Page Object классах для снижения дублирования кода.
- Screenplay + Page Object: Можно интегрировать акторов и задачи из Screenplay для работы с Page Object.
Пример совмещения:
public class LoginPage {
private WebDriver driver;
private Dropdown languageDropdown;
public LoginPage(WebDriver driver) {
this.driver = driver;
this.languageDropdown = new Dropdown(driver.findElement(By.id("language")));
}
public void selectLanguage(String language) {
languageDropdown.selectByValue(language);
}
}
Выбор подхода зависит от задач проекта.
Для гибкости подойдёт 🎭 Screenplay, для быстрого старта — 🗺️ UI Mapping, для работы с компонентами — 🔧 Component Object Model. Page Object остаётся хорошей основой, которую можно совмещать с другими методологиями.