Что такое паттерн Page Object Model (POM) в тестировании?

«Что такое паттерн Page Object Model (POM) в тестировании?» — вопрос из категории Автоматизация тестирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

  • Локаторы элементов страницы (селекторы).
  • Методы для взаимодействия с этими элементами.

Пример реализации на Python с Selenium:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class LoginPage:
    # Локаторы элементов вынесены в атрибуты класса
    USERNAME_INPUT = (By.ID, "username")
    PASSWORD_INPUT = (By.ID, "password")
    SUBMIT_BUTTON = (By.ID, "loginBtn")
    ERROR_MESSAGE = (By.CLASS_NAME, "alert-error")

    def __init__(self, driver):
        self.driver = driver
        self.wait = WebDriverWait(driver, 10)

    # Метод, инкапсулирующий действие "логин"
    def login(self, username, password):
        self.driver.find_element(*self.USERNAME_INPUT).send_keys(username)
        self.driver.find_element(*self.PASSWORD_INPUT).send_keys(password)
        self.driver.find_element(*self.SUBMIT_BUTTON).click()

    # Метод для получения текста ошибки
    def get_error_message(self):
        element = self.wait.until(EC.visibility_of_element_located(self.ERROR_MESSAGE))
        return element.text

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

  • Повторное использование кода: Локаторы и методы страницы используются во всех тестах.
  • Устойчивость к изменениям: Если изменится селектор, правка вносится только в одном классе Page Object.
  • Читаемость тестов: Тестовые сценарии становятся краткими и понятными.
    # Тест использует Page Object
    login_page = LoginPage(driver)
    login_page.login("test_user", "wrong_pass")
    assert "Invalid credentials" in login_page.get_error_message()