Selenium Page Object Model: что это такое и как применить в проекте?

Что такое Page Object Model?

Page Object Model (POM) – это один из наиболее популярных паттернов проектирования в автоматизированном тестировании веб-приложений с использованием Selenium WebDriver. Он представляет собой подход, при котором каждая веб-страница приложения представляется в виде отдельного класса (Page Object). Внутри этого класса содержатся элементы страницы (веб-элементы) и методы для взаимодействия с ними. Суть POM заключается в разделении логики взаимодействия с веб-страницей от логики тестовых сценариев. Это делает тесты более читаемыми, поддерживаемыми и устойчивыми к изменениям в интерфейсе.

Зачем нужен Page Object Model: преимущества и недостатки

Преимущества POM:

  1. Улучшенная читаемость и поддерживаемость кода. Логика взаимодействия с веб-элементами инкапсулирована в Page Objects, что делает тестовые сценарии более лаконичными и понятными.
  2. Уменьшение дублирования кода. Общие элементы и действия на странице определяются только в Page Object, а не в каждом тесте.
  3. Повышение устойчивости к изменениям. При изменении UI нужно изменить только Page Object, а не все тестовые сценарии, использующие этот элемент.
  4. Ускорение разработки и отладки. POM позволяет разделить работу между разработчиками тестов и упрощает локализацию ошибок.

Недостатки POM:

  1. Увеличение количества классов. Для каждого Page нужно создать класс, что может привести к большому количеству файлов в проекте. Однако, правильно организованная структура проекта сглаживает этот недостаток.
  2. Необходимость поддерживать актуальность Page Objects. Изменения в UI требуют своевременного обновления Page Objects.

Основные принципы POM

  • Инкапсуляция: Представление каждой веб-страницы в виде отдельного класса.
  • Сокрытие деталей: Скрытие внутренней структуры страницы от тестовых сценариев.
  • Переиспользование: Повторное использование Page Objects в разных тестовых сценариях.
  • Совместная ответственность: Разделение ответственности за взаимодействие с веб-страницей (Page Object) и логику тестирования (тест).

Реализация Page Object Model в Selenium

Структура проекта с использованием POM

Рекомендуется следующая структура проекта:

project/
├── src/
│   ├── main/
│   │   └── java/
│   │       └── pageobjects/
│   │           ├── HomePage.java
│   │           ├── LoginPage.java
│   │           └── ...
│   └── test/
│       └── java/
│           └── tests/
│               ├── HomePageTest.java
│               ├── LoginPageTest.java
│               └── ...
├── pom.xml (или build.gradle)
└── ...
  • pageobjects/ — здесь находятся классы, представляющие страницы.
  • tests/ — здесь расположены тестовые классы.
  • pom.xml — файл конфигурации Maven.

Создание Page Object для веб-страницы

Пример создания Page Object для страницы логина:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class LoginPage {

    private WebDriver driver;

    private By usernameField = By.id("username");
    private By passwordField = By.id("password");
    private By loginButton = By.id("login");

    /**
     * Конструктор класса LoginPage.
     * @param driver WebDriver instance.
     */
    public LoginPage(WebDriver driver) {
        this.driver = driver;
    }

    /**
     * Ввод имени пользователя.
     * @param username Имя пользователя.
     */
    public void enterUsername(String username) {
        driver.findElement(usernameField).sendKeys(username);
    }

    /**
     * Ввод пароля.
     * @param password Пароль.
     */
    public void enterPassword(String password) {
        driver.findElement(passwordField).sendKeys(password);
    }

    /**
     * Клик на кнопку логина.
     */
    public void clickLoginButton() {
        driver.findElement(loginButton).click();
    }

    /**
     * Выполнение логина.
     * @param username Имя пользователя.
     * @param password Пароль.
     */
    public void login(String username, String password) {
        enterUsername(username);
        enterPassword(password);
        clickLoginButton();
    }
}

Использование аннотаций @FindBy для поиска элементов

@FindBy позволяет более элегантно определять веб-элементы:

Реклама
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

public class LoginPage {

    private WebDriver driver;

    @FindBy(id = "username")
    private WebElement usernameField;

    @FindBy(id = "password")
    private WebElement passwordField;

    @FindBy(id = "login")
    private WebElement loginButton;

    public LoginPage(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }

    public void enterUsername(String username) {
        usernameField.sendKeys(username);
    }

    public void enterPassword(String password) {
        passwordField.sendKeys(password);
    }

    public void clickLoginButton() {
        loginButton.click();
    }

    public void login(String username, String password) {
        enterUsername(username);
        enterPassword(password);
        clickLoginButton();
    }
}

Написание тестовых сценариев с использованием Page Objects

Пример тестового сценария с использованием Page Object:

import org.junit.jupiter.api.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import static org.junit.jupiter.api.Assertions.assertTrue;

public class LoginPageTest {

    @Test
    public void testLoginSuccessful() {
        WebDriver driver = new ChromeDriver();
        driver.get("http://example.com/login");

        LoginPage loginPage = new LoginPage(driver);
        loginPage.login("validUser", "validPassword");

        assertTrue(driver.getCurrentUrl().contains("/dashboard"));

        driver.quit();
    }
}

Продвинутые техники и паттерны POM

Page Factories: упрощение инициализации Page Objects

PageFactory (как показано выше с @FindBy) автоматизирует процесс инициализации веб-элементов. Он использует аннотации @FindBy для поиска элементов и инициализации их значениями.

Использование наследовани в Page Objects

Если несколько страниц имеют общие элементы или функциональность, можно использовать наследование. Создается базовый класс (например, BasePage) с общими элементами, а затем от него наследуются Page Objects для конкретных страниц.

Компоненты страниц (Page Fragments)

Компоненты страниц, или Page Fragments, представляют собой небольшие, переиспользуемые части страницы, такие как навигационное меню или форма поиска. Они также реализуются в виде отдельных классов и могут быть включены в другие Page Objects.

Примеры использования POM в реальных проектах

Анализ реальных кейсов использования POM

В проектах, где UI постоянно меняется, POM помогает быстро адаптировать тесты к изменениям. Например, при тестировании интернет-магазина, изменения в карточке товара потребуют обновления только соответствующего Page Object, а не всех тестов, связанных с товарами.

Интеграция с фреймворками автоматизации (TestNG, JUnit)

POM легко интегрируется с фреймворками автоматизации, такими как TestNG и JUnit. TestNG предоставляет более гибкие возможности конфигурации тестов (например, параллельное выполнение, параметризованные тесты), а JUnit – более простой и легкий подход.

Работа с репозиториями (GitHub) и примерами кода

На GitHub можно найти множество примеров проектов, использующих POM. При поиске используйте ключевые слова: «selenium page object model framework github на русском». Анализируя эти проекты, можно получить практический опыт и узнать о различных подходах к реализации POM.

Заключение

Лучшие практики использования POM

  • Четкое разделение ответственности: Page Objects должны отвечать только за взаимодействие с веб-страницей, а тесты — за проверку логики.
  • Не перегружайте Page Objects: Не добавляйте в Page Objects слишком много методов, которые не связаны с взаимодействием со страницей.
  • Используйте понятные имена: Давайте классам и методам Page Objects понятные имена, отражающие их назначение.
  • Регулярно обновляйте Page Objects: Следите за изменениями в UI и своевременно обновляйте Page Objects.

Распространенные ошибки и как их избежать

  • Смешивание логики тестов и Page Objects. Избегайте добавления логики проверок в Page Objects.
  • Создание слишком больших Page Objects. Разделяйте сложные страницы на компоненты.
  • Игнорирование принципа DRY (Don’t Repeat Yourself). Используйте наследование и компоненты для переиспользования кода.

Дальнейшее развитие и ресурсы для изучения POM

  • Документация Selenium WebDriver.
  • Примеры проектов на GitHub.
  • Онлайн-курсы и статьи по автоматизированному тестированию.
  • Книги по Selenium WebDriver и паттернам проектирования.

Добавить комментарий