Урок 11. Page Object Model
⚡ Кратко: 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"vsscope="class" - Базовый тестовый класс
BaseTestсautouse=True - Структура проекта:
pages/,tests/,conftest.py - Практические задания из лекции на saucedemo.com
📚 Что повторить перед изучением
- ← Урок 10: Summary session 5 — продвинутый Selenium
- ← Урок 09: Alert, ActionChains, iframe
- Классы Python:
__init__, наследование,self - pytest-фикстуры:
@pytest.fixture,yield,scope - WebDriverWait + EC: явные ожидания
- Локаторы:
By.ID,By.CLASS_NAME,By.XPATH
🎯 Что изучать дальше
- → Урок 12: Summary session 6 — повторение POM
- Параметризация тестов:
@pytest.mark.parametrize - conftest.py на уровне проекта — глобальные фикстуры
- Скриншоты при падении:
driver.save_screenshot() - Allure-отчёты для POM-проектов