Page Object Model — це підхід у автоматизації тестування, коли:
Кожна сторінка сайту описується окремим класом/файлом.
У цьому класі ми зберігаємо локатори елементів і методи для роботи з ними.
Тести стають чистими та читабельними, бо вся логіка взаємодії з елементами винесена в окремі файли.
Без POM тест може виглядати як “суцільна каша” з локаторів і дій.
З POM тести виглядають як інструкція: “відкрий сторінку”, “заповни форму”, “натисни кнопку”.
tests/
test_registration.py
test_required_fields_validation.py
pages/
registration_page.py
from playwright.sync_api import Page
class RegistrationPage:
def __init__(self, page: Page):
self.page = page
self.switch_to_register_button = 'button[data-testid="switch-to-register-button"]'
self.name_input = 'input[data-testid="register-name-input"]'
self.email_input = 'input[data-testid="register-email-input"]'
self.password_input = 'input[data-testid="register-password-input"]'
self.confirm_password_input = 'input[data-testid="register-confirm-password-input"]'
self.currency_select = 'select[data-testid="register-currency-select"]'
self.submit_button = 'button[data-testid="register-submit-button"]'
self.sidebar = '[data-testid="sidebar"]'
# Errors
self.name_error = '[data-testid="name-error"]'
self.email_error = '[data-testid="email-error"]'
self.password_error = '[data-testid="password-error"]'
self.confirm_password_error = '[data-testid="confirm-password-error"]'
def open(self):
self.page.goto("https://finmore.netlify.app")
self.page.click(self.switch_to_register_button)
def register(self, name, email, password, confirm_password, currency):
self.page.fill(self.name_input, name)
self.page.fill(self.email_input, email)
self.page.fill(self.password_input, password)
self.page.fill(self.confirm_password_input, confirm_password)
self.page.select_option(self.currency_select, currency)
self.page.click(self.submit_button)
def submit_empty_form(self):
self.page.click(self.submit_button)
def wait_for_sidebar(self):
sidebar_locator = self.page.locator(self.sidebar)
sidebar_locator.wait_for(state="visible", timeout=5000)
return sidebar_locator.is_visible()
def get_error_text(self, locator):
return self.page.locator(locator).text_content()
def is_error_visible(self, locator):
return self.page.locator(locator).is_visible()
from playwright.sync_api import sync_playwright
from pages.registration_page import RegistrationPage
def test_registration():
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
context = browser.new_context()
page = context.new_page()
registration_page = RegistrationPage(page)
# Відкриваємо сторінку та форму
registration_page.open()
# Заповнюємо форму
registration_page.register(
name="Іван Петренко",
email="ivan.petrenko@example.com",
password="Qwerty123",
confirm_password="Qwerty123",
currency="UAH"
)
# Перевіряємо успішну реєстрацію
assert registration_page.wait_for_sidebar(), "Сайдбар не відображається, користувач не авторизований"
browser.close()
from playwright.sync_api import sync_playwright
from pages.registration_page import RegistrationPage
def test_required_fields_validation():
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
context = browser.new_context()
page = context.new_page()
registration_page = RegistrationPage(page)
# Відкриваємо форму
registration_page.open()
# Відправляємо порожню форму
registration_page.submit_empty_form()
# Перевірка помилок
assert registration_page.is_error_visible(registration_page.name_error), "Помилка імені не відображається"
assert "обов'язкове" in registration_page.get_error_text(registration_page.name_error), "Текст помилки імені некоректний"
assert registration_page.is_error_visible(registration_page.email_error), "Помилка email не відображається"
assert "обов'язковий" in registration_page.get_error_text(registration_page.email_error), "Текст помилки email некоректний"
assert registration_page.is_error_visible(registration_page.password_error), "Помилка паролю не відображається"
assert "обов'язковий" in registration_page.get_error_text(registration_page.password_error), "Текст помилки паролю некоректний"
assert registration_page.is_error_visible(registration_page.confirm_password_error), "Помилка підтвердження паролю не відображається"
assert "обов'язкове" in registration_page.get_error_text(registration_page.confirm_password_error), "Текст помилки підтвердження паролю некоректний"
browser.close()
Всі селектори зібрані в одному місці (registration_page.py).
Якщо зміниться верстка — редагуємо лише один файл.
Тести стали короткі та зрозумілі.
Легко додавати нові методи для роботи з формою.
registration_page.pyfrom playwright.sync_api import Page
Ми імпортуємо клас Page із Playwright.Page — це об’єкт, який представляє вкладку браузера.
Через нього ми відкриваємо сторінки, клікаємо, вводимо текст, читаємо елементи.
Оголошення класу
def __init__(self, page: Page):
self.page = page
Конструктор (__init__) викликається, коли ми створюємо об’єкт класу.
Ми передаємо об’єкт page (вкладка браузера) з тесту у цей клас і зберігаємо його в self.page.
Тепер всі методи цього класу можуть керувати браузером через self.page.
class RegistrationPage:
Створюємо Page Object для сторінки реєстрації.
Page Object — це як “модель” сторінки: тут описані всі селектори та методи, які з нею працюють.
Тут ми зберігаємо CSS-селектори для елементів сторінки.
Краще виносити селектори сюди, щоб:
не дублювати їх у тестах;
якщо зміниться HTML — треба виправити тільки тут.
data-testid — це атрибут, який зазвичай додають розробники спеціально для автотестів.
Метод відкриття сторінки
def open(self):
self.page.goto(“https://finmore.netlify.app”)
self.page.click(self.switch_to_register_button)
goto() — відкриває потрібну URL-сторінку.
Потім клікаємо по кнопці “Зареєструватися”, щоб відкрити форму.
Таким чином, тестам не треба повторювати цей код, вони просто викличуть registration_page.open().
Метод реєстрації
def register(self, name, email, password, confirm_password, currency):
self.page.fill(self.name_input, name)
self.page.fill(self.email_input, email)
self.page.fill(self.password_input, password)
self.page.fill(self.confirm_password_input, confirm_password)
self.page.select_option(self.currency_select, currency)
self.page.click(self.submit_button)
Приймає всі потрібні дані як аргументи.
fill() — вводить текст у поле.
select_option() — вибирає значення в <select>.
click() — натискає на кнопку.
Весь процес реєстрації тепер можна виконати одним викликом:
registration_page.register(“Іван”, “ivan@example.com”, “Qwerty123”, “Qwerty123”, “UAH”)
Відправка пустої форми
def submit_empty_form(self):
self.page.click(self.submit_button)
Використовується для тестів валідації (щоб перевірити помилки при пустих полях).
Очікування появи сайдбару
def wait_for_sidebar(self):
sidebar_locator = self.page.locator(self.sidebar)
sidebar_locator.wait_for(state=”visible”, timeout=5000)
return sidebar_locator.is_visible()
locator() — знаходить елемент на сторінці.
wait_for() — чекає, поки елемент стане видимим (максимум 5 секунд).
Повертає True або False залежно від того, чи з’явився сайдбар.
Використовується в перевірках успішної авторизації.
Отримання тексту помилки
def get_error_text(self, locator):
return self.page.locator(locator).text_content()
Повертає текст із помилки (наприклад, “Поле обов’язкове”).
Перевірка видимості помилки
def is_error_visible(self, locator):
return self.page.locator(locator).is_visible()
Повертає True, якщо помилка видима на сторінці.
registration_page.py — це карта сторінки + набір дій, які можна виконати з її елементами.
В тестах тепер не потрібно думати про локатори — вони просто викликають методи класу.
from playwright.sync_api import sync_playwright
from pages.registration_page import RegistrationPage
sync_playwright — синхронний API Playwright, щоб можна було писати код у звичайному послідовному стилі.
RegistrationPage — це ваш власний Page Object клас, який інкапсулює всі дії та локатори, пов’язані зі сторінкою реєстрації.
Основна функція тесту
def test_registration():
Це функція, яка буде виконуватись тестовим раннером (наприклад, pytest).
Запуск браузера
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
context = browser.new_context()
page = context.new_page()
p.chromium.launch(headless=True) — відкриває Chromium у безголовому режимі (без графічного інтерфейсу).
new_context() — створює новий браузерний контекст (аналог окремого користувацького сеансу).
new_page() — відкриває нову вкладку в цьому контексті.
Ініціалізація Page Object
registration_page = RegistrationPage(page)
Тут створюється екземпляр сторінки реєстрації, якому передається page з Playwright.
Тепер можна викликати методи, описані в RegistrationPage.
Відкриття сторінки та форми
registration_page.open()
Цей метод у Page Object відкриває потрібну URL сторінки реєстрації та, ймовірно, чекає завантаження форми.
Заповнення форми
Метод register():
Вводить ім’я
Вводить email
Встановлює пароль і підтвердження пароля
Обирає валюту (UAH)
Надсилає форму (натискає кнопку реєстрації)
Перевірка успішної реєстрації
assert registration_page.wait_for_sidebar(), “Сайдбар не відображається, користувач не авторизований”
Метод wait_for_sidebar() чекає появи елемента сайдбара, що свідчить про успішний логін після реєстрації.
Якщо сайдбар не з’явився — тест падає з повідомленням.
Закриття браузера
browser.close()
Закриває браузер і завершує роботу Playwright.
Сенс тесту — автоматично перевірити, що новий користувач може зареєструватись і після цього потрапляє в систему (відображається сайдбар).
Цей підхід з POM робить тест чистим, читабельним і легко підтримуваним — усі локатори та логіка роботи зі сторінкою зберігаються окремо від тесту.
Page Object Model (POM) у Playwright / Python
Своїми словами пояснити:
Що таке Page Object Model.
Які є переваги POM.
Які є ризики та недоліки POM.
Коли не варто використовувати POM.
Кроки:
Заповнити ім’я та email валідними даними.У полі "Пароль" ввести 12345.Повторити пароль: 12345.Натиснути "Зареєструватися".
Очікуваний результат: З’являється повідомлення про помилку ("Мінімум 6 символів").
Кроки:
Заповнити всі поля валідно.
У полі "Пароль" ввести Qwerty123.
У полі "Підтвердження паролю" ввести Qwerty124.
Натиснути "Зареєструватися".
Очікуваний результат: Повідомлення про помилку ("Паролі не збігаються").
Заповнити ім’я і пароль валідними даними.
У полі "Email" ввести ivan.petrenko.com (без @).
Натиснути "Зареєструватися".
Очікуваний результат: Повідомлення про помилку ("Некоректний email").

Если вам требуется какая-либо поддержка или у вас возникли дополнительные вопросы, не стесняйтесь связаться с нами – мы готовы быстро оказать вам помощь.
Мы также присутствуем в социальных сетях! Подписывайтесь на нас и получайте последние новости, акции, скидки, бесплатные тренинги и участие в марафонах.
Будем рады видеть вас в нашем сообществе!
Публичная оферта. Авторское право © 2024 Школа подготовки тестировщиков