Page Object Model (POM)

Что такое Page Object Model и как использовать в Selenium

Page Object Model (POM) — это шаблон проектирования, который используется при автоматизации тестирования веб-приложений для улучшения читаемости и поддерживаемости кода.

Основная идея POM заключается в том, чтобы представить каждую веб-страницу приложения в виде отдельного класса. Этот класс содержит все элементы этой страницы и методы для взаимодействия с ними.

Основные принципы Page Object Model

  1. Отделение логики тестирования от пользовательского интерфейса: При использовании POM логика теста и пользовательский интерфейс хранятся раздельно. Тесты используют методы объектов страниц для взаимодействия с веб-приложением, что делает тесты более понятными и менее чувствительными к изменениям в дизайне или структуре страниц.
  2. Повторное использование кода: Так как каждая страница представлена в виде объекта, методы этой страницы можно повторно использовать в разных тестах.
  3. Более простое обслуживание: Если дизайн или структура веб-страницы меняется, достаточно обновить соответствующий класс страницы, а не каждый отдельный тест.

Пример Page Object Model на Python с использованием Selenium

Предположим, у нас есть страница входа с полями для ввода имени пользователя и пароля, а также кнопкой входа.

Создание класса для страницы входа:

from selenium.webdriver.common.by import By

class LoginPage:

    def __init__(self, driver):
        self.driver = driver
        self.username_input = (By.ID, "username")
        self.password_input = (By.ID, "password")
        self.login_button = (By.ID, "login")

    def enter_username(self, username):
        self.driver.find_element(*self.username_input).send_keys(username)

    def enter_password(self, password):
        self.driver.find_element(*self.password_input).send_keys(password)

    def click_login(self):
        self.driver.find_element(*self.login_button).click()

Использование класса страницы в тесте:

from selenium import webdriver

def test_login():
    driver = webdriver.Chrome()
    driver.get("https://example.com/login")

    # Используем объект LoginPage для взаимодействия со страницей
    login_page = LoginPage(driver)
    login_page.enter_username("testuser")
    login_page.enter_password("password123")
    login_page.click_login()

    # Здесь может быть код для проверки успешного входа...

    driver.quit()

Таким образом, при использовании POM ваши автоматические тесты становятся более структурированными, читаемыми и поддерживаемыми.

Рекомендации по использованию

  • Параметризация методов: Методы ваших объектов страницы могут быть параметризованы для увеличения их гибкости. Например, вы можете создать один метод fill_form() вместо отдельных методов для ввода имени пользователя и пароля.
  • Включение ожиданий: Очень часто при работе с веб-страницами нужно использовать ожидания (например, WebDriverWait в Selenium), чтобы удостовериться, что элемент доступен для взаимодействия. Эти ожидания можно инкапсулировать внутри методов объекта страницы.
  • Работа с модальными окнами и всплывающими уведомлениями: В POM можно также инкапсулировать логику работы с модальными окнами и всплывающими уведомлениями.
  • Наследование и композиция: Некоторые элементы или блоки могут быть повторно использованы на различных страницах (например, меню навигации). В этом случае вы можете использовать наследование или композицию для организации кода.
  • Добавление ассертов: Хотя часто рекомендуется разделять логику теста и POM, в некоторых случаях может быть полезно добавить методы проверки (ассерты) непосредственно в класс страницы. Так, метод is_logged_in() может проверять наличие определенного элемента на странице после входа.
  • Работа с различными окружениями: Если ваше приложение имеет различные окружения (например, стейджинг и продакшн), POM может быть настроен так, чтобы учитывать различия между этими окружениями.
  • Page Factory: В некоторых языках и библиотеках существует подход или утилита под названием "Page Factory", которая позволяет еще более удобно и интуитивно работать с элементами на странице.

В целом, ключевой идеей POM является создание абстракции вокруг веб-страницы, что позволяет отделить тестовую логику от структуры веб-приложения. Это делает тесты более устойчивыми к изменениям в приложении и облегчает поддержку кода.

Заключение

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

Содержание: