Автоматизация «Playwright + Python»

Що таке Page Object Model (POM)

Page Object Model — це підхід у автоматизації тестування, коли:

  1. Кожна сторінка сайту описується окремим класом/файлом.

  2. У цьому класі ми зберігаємо локатори елементів і методи для роботи з ними.

  3. Тести стають чистими та читабельними, бо вся логіка взаємодії з елементами винесена в окремі файли.

Без POM тест може виглядати як “суцільна каша” з локаторів і дій.
З POM тести виглядають як інструкція: “відкрий сторінку”, “заповни форму”, “натисни кнопку”.

Структура проєкту

tests/
    test_registration.py
    test_required_fields_validation.py
pages/
   registration_page.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()

				
			

tests/test_registration.py

				
					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()

				
			

tests/test_required_fields_validation.py

				
					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()

				
			

Що ми виграли завдяки Page Object:

  • Всі селектори зібрані в одному місці (registration_page.py).

  • Якщо зміниться верстка — редагуємо лише один файл.

  • Тести стали короткі та зрозумілі.

  • Легко додавати нові методи для роботи з формою.

Давай розберемо  registration_page.py

Імпорт модуля Page

from 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 — це як “модель” сторінки: тут описані всі селектори та методи, які з нею працюють.

Локатори елементів
 
self.switch_to_register_button = ‘button[data-testid=”switch-to-register-button”]’
self.name_input = ‘input[data-testid=”register-name-input”]’
 

Тут ми зберігаємо 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 — це карта сторінки + набір дій, які можна виконати з її елементами.
В тестах тепер не потрібно думати про локатори — вони просто викликають методи класу.

Давай розберемо

test_registration.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 сторінки реєстрації та, ймовірно, чекає завантаження форми.

Заповнення форми

registration_page.register(
name=”Іван Петренко”,
email=”ivan.petrenko@example.com”,
password=”Qwerty123″,
confirm_password=”Qwerty123″,
currency=”UAH”
)

Метод 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

Заповнити ім’я і пароль валідними даними.
У полі "Email" ввести ivan.petrenko.com (без @).
Натиснути "Зареєструватися".
Очікуваний результат: Повідомлення про помилку ("Некоректний email").

Поддержка и вопросы

Если вам требуется какая-либо поддержка или у вас возникли дополнительные вопросы, не стесняйтесь связаться с нами – мы готовы быстро оказать вам помощь.

Через чат-бот

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

Курсы

Публичная оферта. Авторское право © 2024 Школа подготовки тестировщиков