Пример 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 — иллюстративные. Реальные эндпоинты/локаторы проверяйте по своему приложению.