💻 Примеры: POM, фикстуры, трассировка

← К оглавлению урока

⚡ Структура проекта

project/
├── pages/
│   ├── login_page.py
│   └── inventory_page.py
├── tests/
│   └── test_shop.py
└── conftest.py

Пример 1. Классы страниц (POM)

# pages/login_page.py
from playwright.sync_api import Page

class LoginPage:
    def __init__(self, page: Page):
        self.page = page
        self.username = page.get_by_placeholder("Username")
        self.password = page.get_by_placeholder("Password")
        self.login_btn = page.get_by_role("button", name="Login")

    def open(self):
        self.page.goto("/")

    def login(self, user, pwd):
        self.username.fill(user)
        self.password.fill(pwd)
        self.login_btn.click()
# pages/inventory_page.py
from playwright.sync_api import Page

class InventoryPage:
    def __init__(self, page: Page):
        self.page = page
        self.title = page.get_by_text("Products")
        self.items = page.locator(".inventory_item")
        self.cart_badge = page.locator(".shopping_cart_badge")

    def add_to_cart(self, name: str):
        self.items.filter(has_text=name) \
            .get_by_role("button", name="Add to cart").click()

Пример 2. conftest.py — фикстуры и настройки

# conftest.py
import pytest
from pages.login_page import LoginPage
from pages.inventory_page import InventoryPage

@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):
    return {**browser_context_args, "viewport": {"width": 1440, "height": 900}}

@pytest.fixture
def login_page(page):
    return LoginPage(page)

@pytest.fixture
def inventory_page(page):
    return InventoryPage(page)

Пример 3. Тест на POM

# tests/test_shop.py
from playwright.sync_api import expect

def test_add_backpack(login_page, inventory_page):
    login_page.open()
    login_page.login("standard_user", "secret_sauce")

    expect(inventory_page.title).to_be_visible()
    inventory_page.add_to_cart("Sauce Labs Backpack")
    expect(inventory_page.cart_badge).to_have_text("1")

Запуск: pytest --base-url https://www.saucedemo.com -n auto

Пример 4. Трассировка упавшего теста

# Терминал
pytest --tracing=retain-on-failure
# при падении появится trace.zip в test-results/
playwright show-trace test-results/.../trace.zip

Пример 5. UI + API в одном тесте

# conftest.py — контекст для API
import pytest
from playwright.sync_api import Playwright

@pytest.fixture(scope="session")
def api_request_context(playwright: Playwright):
    ctx = playwright.request.new_context(base_url="https://api.example.com")
    yield ctx
    ctx.dispose()

# test_api_ui.py
from playwright.sync_api import expect

def test_create_via_api_check_ui(api_request_context, page):
    resp = api_request_context.post("/items", data={"name": "Книга"})
    assert resp.ok
    page.goto("https://example.com/items")
    expect(page.get_by_text("Книга")).to_be_visible()
⚠️ URL и data-testid — иллюстративные. Реальные эндпоинты/локаторы проверяйте по своему приложению.