Урок 11. Page Object Model

📁 Блок: Selenium ⏱️ Время изучения: ~60 мин 🎯 Сложность: Продвинутая
#POM #PageObject #BasePage #fixtures #scope-class #BaseTest

⚡ Кратко: Page Object Model

Page Object Model (POM) — паттерн, при котором каждая страница приложения описывается классом. Класс хранит локаторы и методы взаимодействия с элементами, а тесты вызывают только методы страниц.

  • Проблема без POM: локаторы дублируются во всех тестах — при изменении UI нужно обновить каждый тест вручную.
  • Решение POM: LoginPage, InventoryPage, CartPage — классы-страницы; BasePage — общие методы; conftest.py — pytest-фикстуры для driver и страниц.
  • scope="class": браузер создаётся один раз на весь класс тестов — быстрее, чем scope="function".
  • BaseTest: базовый тестовый класс с autouse=True-фикстурой — тестовые классы наследуются от него и получают self.driver, self.login_page, …

Топ-3 ошибки: 1) Локаторы в тестах, а не в классе страницы. 2) scope="class", но тесты изменяют состояние браузера — следующий тест падает. 3) Забыли создать __init__.py в pages/ — импорт не работает.

📖 О чём этот урок

Когда тестов становится больше десяти, написание локаторов прямо в каждом тесте превращается в проблему: дублирование, хрупкость, трудность сопровождения. Page Object Model (POM) — паттерн проектирования, который решает эту проблему: каждая страница описывается классом, локаторы хранятся в одном месте, а тесты работают только с методами страниц.

В уроке мы разберём POM от «зачем» до «как», построим полноценный проект с LoginPage, InventoryPage, CartPage, CheckoutPage и базовым классом BaseTest для pytest.

Что изучим

  • Проблемы тестов без POM — дублирование локаторов, сложность поддержки
  • Основные принципы POM: инкапсуляция, централизованное управление, переиспользование
  • Классы страниц: LoginPage, InventoryPage, CartPage
  • Базовый класс страницы (BasePage) с общими методами
  • pytest-фикстуры: scope="function" vs scope="class"
  • Базовый тестовый класс BaseTest с autouse=True
  • Структура проекта: pages/, tests/, conftest.py
  • Практические задания из лекции на saucedemo.com

📚 Что повторить перед изучением

🎯 Что изучать дальше

  • → Урок 12: Summary session 6 — повторение POM
  • Параметризация тестов: @pytest.mark.parametrize
  • conftest.py на уровне проекта — глобальные фикстуры
  • Скриншоты при падении: driver.save_screenshot()
  • Allure-отчёты для POM-проектов