Что такое E2E-тест
End-to-end тест проходит весь пользовательский сценарий: от входа до результата. Для магазина это: войти → выбрать товары → проверить корзину → заполнить данные доставки → подтвердить заказ → увидеть «Спасибо за заказ». Такой тест ловит проблемы на стыках страниц, которые не видны в юнит-проверках отдельных элементов.
План проекта
- POM-страницы:
LoginPage,InventoryPage,CartPage,CheckoutPage. - Авторизация: фикстура, которая логинится один раз и сохраняет состояние сессии.
- Тесты: полный заказ (happy path) + data-driven добавление товаров + негативный сценарий (пустая форма доставки).
- Запуск: с
--base-url, трассировкой и параллельно.
Авторизация один раз: storage_state
Логиниться в каждом тесте — медленно. Playwright умеет сохранить состояние сессии (cookies + localStorage) в файл и переиспользовать его в новом контексте.
# conftest.py
import pytest
from playwright.sync_api import Browser
@pytest.fixture(scope="session")
def storage_state(browser: Browser, tmp_path_factory):
path = tmp_path_factory.mktemp("auth") / "state.json"
context = browser.new_context()
page = context.new_page()
page.goto("https://www.saucedemo.com/")
page.get_by_placeholder("Username").fill("standard_user")
page.get_by_placeholder("Password").fill("secret_sauce")
page.get_by_role("button", name="Login").click()
page.wait_for_url("**/inventory.html")
context.storage_state(path=str(path))
context.close()
return str(path)
# переопределяем аргументы контекста — все тесты стартуют залогиненными
@pytest.fixture
def browser_context_args(browser_context_args, storage_state):
return {**browser_context_args, "storage_state": storage_state}
Зачем: десятки тестов перестают тратить время на повторный логин и не зависят от его стабильности.
Стратегия проверок
Проверяйте результат каждого шага: после добавления — бейдж корзины; после перехода в корзину — состав; после оформления — текст благодарности. Так при падении сразу видно, на каком шаге сломалось.
Data-driven через parametrize
import pytest
@pytest.mark.parametrize("product", [
"Sauce Labs Backpack",
"Sauce Labs Bike Light",
"Sauce Labs Bolt T-Shirt",
])
def test_add_product(inventory_page, product):
inventory_page.add_to_cart(product)
expect(inventory_page.cart_badge).to_have_text("1")
⚠️ Локаторы/тексты saucedemo приведены как пример. Реальные значения сверяйте через codegen/инспектор.