📖 Теория: E2E-проект

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

⚡ Суть

  • E2E = проверяем целый пользовательский путь, а не один элемент.
  • Логин — дорогой шаг; делаем его один раз и сохраняем storage_state.
  • Проверка на каждом шаге сценария, а не только в конце.
  • POM держит сценарий читаемым; данные — отдельно (parametrize).

Что такое E2E-тест

End-to-end тест проходит весь пользовательский сценарий: от входа до результата. Для магазина это: войти → выбрать товары → проверить корзину → заполнить данные доставки → подтвердить заказ → увидеть «Спасибо за заказ». Такой тест ловит проблемы на стыках страниц, которые не видны в юнит-проверках отдельных элементов.

План проекта

  1. POM-страницы: LoginPage, InventoryPage, CartPage, CheckoutPage.
  2. Авторизация: фикстура, которая логинится один раз и сохраняет состояние сессии.
  3. Тесты: полный заказ (happy path) + data-driven добавление товаров + негативный сценарий (пустая форма доставки).
  4. Запуск: с --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/инспектор.