End-to-end тестирование с Playwright
Тестируйте приложение так, как им пользуются люди: в настоящем браузере и автоматически.
За 30 секунд
End-to-end (E2E) тесты проводят настоящий браузер через реальные пользовательские флоу, например регистрацию или оформление заказа, чтобы доказать, что вся система работает вместе. Playwright от Microsoft запускает такие тесты в Chromium, Firefox и WebKit с автоматическим ожиданием, надёжными локаторами, параллельными прогонами и trace viewer для отладки. Это самый популярный современный E2E-фреймворк, новый минорный релиз выходит примерно раз в месяц (1.6x в конце 2026 года).
Не в моём ежедневном стеке — я понимаю принципы и изучу детали, когда это понадобится проекту.
Почему это важно
- Все unit-тесты могут проходить, а кнопка входа при этом ничего не делать. E2E-тесты ловят проблемы на стыке фронтенда, бэкенда, базы данных и сторонних скриптов.
- Автоматическое ожидание и web-first assertions в Playwright убирают большую часть нестабильности, из-за которой у старых E2E-инструментов была плохая репутация.
- Один API покрывает три браузерных движка, эмуляцию мобильных устройств, API-вызовы и визуальные сравнения, поэтому команде нужно меньше инструментов.
- Он находится на вершине пирамиды тестирования, над unit- и интеграционными тестами на PHPUnit или Jest: тестов меньше, но они защищают флоу, которые приносят деньги.
Как это работает
01Место E2E в пирамиде тестирования
В основании пирамиды тестирования много быстрых unit-тестов, в середине — меньше интеграционных, а на вершине — небольшое число E2E-тестов. E2E-тесты самые реалистичные, но и самые медленные и дорогие в поддержке, поэтому используйте их для критичных сценариев: регистрация, вход, поиск, добавление в корзину, checkout, сброс пароля, ключевые действия в админке. Не проверяйте каждое сообщение валидации через браузер — это задача unit- или компонентных тестов. В здоровом наборе от десятков до нескольких сотен E2E-тестов, которые параллельно выполняются за минуты, и каждый защищает то, поломка чего ударит по пользователям или выручке.
02Установка и первый тест
Установите через npm init playwright@latest — команда создаст конфиг, пример теста и workflow для GitHub Actions и скачает браузеры. Тест — это async-функция, получающая фикстуры; самая важная из них — page, новая вкладка браузера в изолированном browser context (как новый профиль инкогнито) для каждого теста. Находите элементы локаторами, ориентированными на пользователя, такими как getByRole, getByLabel и getByText, выполняйте над ними действия и проверяйте через expect. Playwright автоматически ждёт, пока элементы станут видимыми, доступными и стабильными, прежде чем кликнуть, а web-first assertions вроде toBeVisible и toHaveURL повторяются, пока не пройдут или не истечёт таймаут. Ручные ожидания почти никогда не нужны.
import { test, expect } from "@playwright/test";
test("user can search and open a product", async ({ page }) => {
await page.goto("/");
await page.getByRole("searchbox", { name: "Search" }).fill("running shoes");
await page.getByRole("button", { name: "Search" }).click();
const results = page.getByRole("listitem").filter({ hasText: "Trail" });
await expect(results.first()).toBeVisible();
await results.first().getByRole("link").click();
await expect(page).toHaveURL(/\/products\//);
await expect(page.getByRole("heading", { level: 1 })).toContainText("Trail");
});
03Локаторы, которые переживают редизайн
Нестабильные и хрупкие тесты обычно появляются из-за плохих селекторов. CSS-путь вроде div > div:nth-child(3) > button ломается, когда дизайнер добавляет обёртку. Предпочитайте локаторы, отражающие то, что видят пользователи и вспомогательные технологии: сначала getByRole с доступным именем, затем getByLabel для полей форм, getByPlaceholder, getByText и getByTestId как явный контракт, когда ничего другого стабильного нет. Локаторы ленивые и строгие: они вычисляются заново при каждом действии, а если локатор совпадает с несколькими элементами, Playwright выбрасывает ошибку, а не кликает не туда. Комбинируйте и фильтруйте локаторы, чтобы сузить область, например до строки с конкретным номером заказа. Бонус: локаторы по ролям подталкивают приложение к лучшей доступности.
- Хорошо: page.getByRole("button", { name: "Place order" })
- Хорошо: page.getByLabel("Email")
- Избегайте: page.locator(".btn.btn-primary:nth-child(2)")
04Конфигурация, projects и аутентификация
playwright.config.ts задаёт базовый URL, браузеры (projects), повторы, репортеры и способ запуска приложения. Распространённый паттерн — setup project, который один раз логинится и сохраняет storage state браузера (cookies и localStorage) в файл; остальные projects переиспользуют его, так что большинство тестов стартуют уже аутентифицированными, без повторного прохождения UI логина. webServer запускает приложение перед тестами и ждёт его готовности. Сохраняйте трейсы для упавших повторов — это даёт полную запись для отладки падений в CI. Не коммитьте сохранённый файл аутентификации; добавьте папку в .gitignore.
import { defineConfig, devices } from "@playwright/test";
export default defineConfig({
testDir: "./e2e",
fullyParallel: true,
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 2 : 0,
reporter: [["html"], ["list"]],
use: { baseURL: "http://localhost:3000", trace: "on-first-retry" },
projects: [
{ name: "setup", testMatch: /.*\.setup\.ts/ },
{ name: "chromium", dependencies: ["setup"],
use: { ...devices["Desktop Chrome"], storageState: "playwright/.auth/user.json" } },
{ name: "mobile", dependencies: ["setup"],
use: { ...devices["iPhone 15"], storageState: "playwright/.auth/user.json" } },
],
webServer: { command: "npm run start", url: "http://localhost:3000", reuseExistingServer: !process.env.CI },
});
05Фикстуры и page objects
Фикстуры — это dependency injection в Playwright: тест объявляет, что ему нужно (page, request или собственная фикстура, например залогиненный админ или заранее созданный товар), а Playwright подготавливает и убирает это вокруг теста. Собственные фикстуры заменяют цепочки beforeEach и делают тесты короткими. Page object model оборачивает локаторы и действия страницы в класс, чтобы изменение UI исправлялось в одном месте. Держите page objects тонкими: они предоставляют действия на языке пользователя (addToCart, checkout), а проверки оставляют тестам. Используйте фикстуру request, чтобы создавать тестовые данные через API, — это гораздо быстрее, чем прокликивать UI.
import { test as base, expect } from "@playwright/test";
type Fixtures = { product: { slug: string } };
export const test = base.extend<Fixtures>({
product: async ({ request }, use) => {
const res = await request.post("/api/test/products", { data: { name: "E2E shoe", price: 50 } });
const product = await res.json();
await use(product); // run the test
await request.delete("/api/test/products/" + product.slug); // clean up
},
});
test("product page shows price", async ({ page, product }) => {
await page.goto("/products/" + product.slug);
await expect(page.getByTestId("price")).toHaveText("$50.00");
});
06Отладка и CI
У Playwright сильные инструменты. npx playwright test --ui открывает UI mode с режимом наблюдения и перемещением во времени по каждому шагу. --debug открывает инспектор для пошагового выполнения действий. codegen записывает ваши клики в тест — хорошая отправная точка, которую потом нужно почистить. Trace viewer показывает каждое действие, снимок DOM, сетевой запрос и лог консоли упавшего теста — так отлаживаются падения в CI без локального воспроизведения. В CI устанавливайте браузеры через npx playwright install --with-deps, запускайте параллельно с workers, разбивайте большие наборы на несколько машин через --shard и загружайте HTML-отчёт и трейсы как артефакты. Официальный Docker-образ содержит все зависимости браузеров.
# .github/workflows/e2e.yml (steps)
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 22, cache: npm }
- run: npm ci
- run: npx playwright install --with-deps
- run: npx playwright test --shard=${{ matrix.shard }}/4
- uses: actions/upload-artifact@v4
if: ${{ !cancelled() }}
with: { name: report-${{ matrix.shard }}, path: playwright-report/ }
Когда применять
- Защита критичных сценариев, таких как регистрация, вход, checkout и платежи, от регрессий.
- Кросс-браузерные проверки, особенно поведение Safari через WebKit, и эмуляция мобильных viewport.
- Smoke-тесты после каждого деплоя, чтобы убедиться, что живое окружение работает.
- Визуальные регрессионные проверки ключевых страниц и компонентов.
Когда не стоит
- Проверка каждого граничного случая бизнес-логики или валидации; unit- и интеграционные тесты быстрее и точнее.
- Нагрузочное тестирование; браузер на каждого пользователя слишком тяжёл, для трафика используйте k6 или аналоги.
- Нестабильные прототипы, UI которых меняется ежедневно; пока флоу не устоятся, тесты будут стоить больше, чем экономят.
Альтернативы
- Cypress
Популярный E2E-инструмент с отличным интерактивным раннером; работает внутри браузера и имеет больше ограничений для флоу с несколькими вкладками и origin.
- Selenium / WebDriver
Давний стандарт с поддержкой всех языков и Selenium Grid; больше шаблонного кода, ручные ожидания встречаются чаще.
- WebdriverIO
Node.js-фреймворк поверх WebDriver и WebDriver BiDi, используется и для мобильных приложений с Appium.
- Vitest browser mode / Testing Library
Компонентные тесты в настоящем браузере; для UI-логики быстрее, чем E2E.
Лучшие практики
- Тестируйте видимое пользователю поведение локаторами по роли, label и тексту; используйте data-testid только как явный контракт.
- Полагайтесь на автоматическое ожидание и web-first assertions; никогда не используйте фиксированные паузы waitForTimeout.
- Держите тесты независимыми: каждый создаёт свои данные, лучше через API, и может выполняться в любом порядке.
- Логиньтесь один раз в setup project и переиспользуйте storageState вместо входа через UI в каждом тесте.
- Мокайте через page.route только то, чем не владеете (сторонние платёжные виджеты, аналитика); собственный бэкенд оставляйте настоящим.
- Собирайте трейсы на первом повторе и загружайте отчёты в CI; считайте нестабильный тест багом, который надо исправить, а не бесконечно перезапускать.
- Запускайте тесты параллельно и шардируйте в CI, чтобы набор укладывался примерно в десять минут.
Частые ошибки
- Хрупкие CSS- или XPath-селекторы, привязанные к вёрстке и именам классов.
- Добавление waitForTimeout(3000) для борьбы с нестабильностью, из-за чего тесты становятся и медленными, и всё равно нестабильными.
- Тесты, зависящие от данных или порядка друг друга, которые ломаются при параллельном запуске.
- Проверка всего через UI, из-за чего получается медленный набор, который никто не запускает локально.
- Сокрытие реальных падений большим числом повторов вместо изучения трейсов.
Глубже
07Как Playwright управляет браузерами
Playwright выполняет код тестов в Node.js и общается с браузерами через постоянное соединение: Chrome DevTools Protocol для Chromium и собственные пропатченные протоколы для Firefox и WebKit. Такой дизайн вне процесса браузера позволяет одному тесту управлять несколькими страницами, контекстами и даже браузерами и напрямую наблюдать за сетевым трафиком. Browser contexts — дешёвые изолированные сессии внутри одного процесса браузера, поэтому каждый тест получает новый контекст за миллисекунды. Playwright привязывает к каждому релизу конкретные сборки браузеров; начиная с 1.57 для Chromium используются сборки Chrome for Testing, а устанавливаются они через npx playwright install. Для дополнительной уверенности можно запускать тесты и в брендовых Chrome или Edge через опцию channel.
08Управление сетью: моки, HAR и API-тестирование
page.route перехватывает запросы, совпадающие с шаблоном URL, чтобы вы могли ответить на них фиксированными данными, изменить их или прервать для имитации сбоев. Так тестируется сценарий «платёжный провайдер недоступен», не ломая настоящего провайдера. routeFromHAR воспроизводит записанный трафик для стабильных демо или офлайн-тестов. Фикстура request — полноценный HTTP-клиент, который при желании разделяет cookies с browser context, поэтому можно создавать данные, вызывать внутренние эндпоинты или писать чистые API-тесты в том же фреймворке. Комбинируйте их: создайте заказ через API, а затем проверьте, что UI его показывает, — это быстро и проверяет оба слоя.
test("shows a friendly error when payments fail", async ({ page }) => {
await page.route("**/api/payments/intent", (route) =>
route.fulfill({ status: 503, json: { error: "unavailable" } }),
);
await page.goto("/checkout");
await page.getByRole("button", { name: "Pay now" }).click();
await expect(page.getByRole("alert")).toContainText("try again");
});
09Визуальное регрессионное тестирование
expect(page).toHaveScreenshot() делает скриншот и попиксельно сравнивает его с сохранённым эталоном, падая, если разница превышает порог. Первый прогон создаёт эталон; обновляйте его осознанно через --update-snapshots. Скриншоты отличаются между операционными системами и из-за рендеринга шрифтов, поэтому генерируйте и сравнивайте эталоны в одном окружении, обычно в официальном Docker-образе Playwright в CI. Снижайте шум: маскируйте динамические области (даты, рекламу, аватары) опцией mask, отключайте анимации, дожидайтесь загрузки шрифтов и по возможности снимайте отдельные компоненты, а не целые страницы. Снимки доступности через toMatchAriaSnapshot сравнивают дерево доступности как текст — это менее хрупко, чем пиксели, и ловит структурные регрессии.
await expect(page).toHaveScreenshot("checkout.png", {
fullPage: true,
mask: [page.getByTestId("order-date"), page.locator(".promo-banner")],
animations: "disabled",
maxDiffPixelRatio: 0.01,
});
10Масштабирование набора: параллелизм, шардирование и контроль нестабильности
По умолчанию Playwright параллельно выполняет тестовые файлы в нескольких worker-процессах; fullyParallel распараллеливает и тесты внутри файла. Каждый worker получает свой браузер, поэтому тесты не должны делить изменяемые данные: создавайте уникальные записи для каждого теста или используйте worker-scoped фикстуры, создающие один аккаунт на worker (поможет testInfo.workerIndex). В CI шардируйте на несколько машин через --shard=1/4 и объединяйте blob-отчёты через npx playwright merge-reports в один HTML-отчёт. Отслеживайте нестабильность: тест, прошедший на повторе, помечается как flaky; разбирайте этот список еженедельно и устраняйте первопричину — обычно это общее состояние, пропущенные await или анимации. --repeat-each и --fail-on-flaky-tests помогают воспроизводить и контролировать. В последних версиях также есть AI-агенты для тестов, которые планируют, генерируют и чинят тесты, но их результат всё равно нужно ревьюить.
Реальные ситуации
Тест checkout падает только в CI
Проблема
E2E-тест checkout локально проходит каждый раз, а в CI падает примерно в одном прогоне из пяти с ошибкой «element not found».
Как решить
Включите trace: "on-first-retry" и скачайте артефакт с трейсом из упавшего прогона. Перейдите к упавшему действию и посмотрите снимок DOM и вкладку сети: часто запрос ещё не завершился, toast перекрыл кнопку или тестовые данные из другого параллельного теста изменили корзину. Замените любой локатор, ищущий по позиции, на локатор по роли и имени, замените ручные ожидания на web-first assertions и дайте тесту собственную корзину через фикстуру, которая создаёт данные через API. Перед merge воспроизведите локально с --repeat-each=20 --workers=4, чтобы подтвердить исправление.
Набор идёт 45 минут, и его никто не ждёт
Проблема
E2E-набор вырос до 600 тестов, которые последовательно выполняются в одной CI-джобе. Разработчики мержат, не дожидаясь, а падения обнаруживаются через несколько дней.
Как решить
Сначала почистите: перенесите тесты валидации и граничных случаев вниз, в unit- и компонентные тесты, оставив E2E для критичных сценариев. Замените вход через UI в каждом тесте на setup project и storageState и наполняйте данные через API, а не через UI. Сделайте тесты независимыми, чтобы можно было включить fullyParallel, затем шардируйте на четыре и более CI-машины и объединяйте blob-отчёты. Пометьте быстрое подмножество тегом @smoke для запуска на каждый pull request, а полный набор запускайте на основной ветке и ночью. Цель — меньше десяти минут на проверки pull request, а нестабильные тесты отслеживайте как баги.
Добавление E2E-тестов в legacy-приложение без test id
Проблема
В старом веб-приложении нет тестов, разметка непоследовательная, а доступных label мало. Команда хочет E2E-покрытие входа и оформления заказа перед большим рефакторингом.
Как решить
Начните с codegen, чтобы записать два основных флоу, затем по возможности перепишите сгенерированные селекторы на локаторы по роли и label. Там, где разметка не даёт стабильной зацепки, добавьте атрибуты data-testid нескольким ключевым элементам — это маленькое и безопасное изменение. Попутно исправляйте отсутствующие label и имена кнопок, что заодно улучшает доступность. Используйте тестовую базу данных с заранее загруженными данными и setup project для аутентификации. Добавьте визуальный снимок страницы подтверждения заказа как страховку. Запустите эти тесты в CI до начала рефакторинга, чтобы они работали как характеризационный набор, защищающий текущее поведение.
Шпаргалка
- Создать новый проект Playwright
npm init playwright@latest- Запустить все тесты
npx playwright test- Интерактивный UI mode
npx playwright test --ui- Отладить один тест
npx playwright test checkout.spec.ts --debug- Записать тест
npx playwright codegen http://localhost:3000- Открыть трейс
npx playwright show-trace trace.zip- Установить браузеры в CI
npx playwright install --with-deps- Шардировать на несколько машин
npx playwright test --shard=2/4- Обновить визуальные эталоны
npx playwright test --update-snapshots- Запустить только тесты с тегом
npx playwright test --grep @smoke
Вопросы и ответы
Q1Почему Playwright менее нестабилен, чем старые E2E-инструменты?
Большая часть нестабильности связана с таймингом: клик до того, как элемент готов, или проверка до загрузки данных. Перед каждым действием Playwright выполняет actionability checks и ждёт, пока элемент будет прикреплён к DOM, видим, стабилен, доступен и способен получать события. Его web-first assertions, такие как toBeVisible или toHaveText, повторяются, пока условие не выполнится или не истечёт таймаут, поэтому ручные паузы не нужны. Каждый тест также запускается в новом browser context, изолирующем cookies и хранилище. Строгие локаторы выбрасывают ошибку при совпадении с несколькими элементами, а не кликают не туда. Вместе это устраняет типичные причины случайных падений.
Q2Какие локаторы стоит использовать?
Используйте локаторы, отражающие то, как пользователи воспринимают страницу. Рекомендуемый порядок: getByRole с доступным именем, например кнопка с именем Place order, затем getByLabel для полей форм, getByPlaceholder, getByText и getByAltText. Используйте getByTestId, когда нет стабильного атрибута, видимого пользователю, и относитесь к test id как к явному контракту между разработчиками и тестами. Избегайте CSS- и XPath-селекторов, привязанных к структуре или классам стилей, потому что они ломаются при редизайне. Локаторы по ролям заодно служат лёгкой проверкой доступности: если вы не можете найти кнопку по роли и имени, пользователи скринридеров, скорее всего, тоже не смогут.
Q3Как работать с аутентификацией в E2E-тестах?
Вход через UI перед каждым тестом медленный и добавляет нестабильности. Рекомендуемый подход — setup project, который один раз логинится через UI или API и сохраняет storage state браузера, то есть cookies и localStorage, в файл. Остальные projects зависят от setup и загружают это состояние, поэтому каждый тест стартует уже аутентифицированным в собственном изолированном контексте. Для разных ролей сохраняйте отдельное состояние на роль, например admin и customer. Держите файл аутентификации вне системы контроля версий, используйте выделенные тестовые аккаунты с секретами из переменных окружения и оставьте один тест, который покрывает сам флоу входа.
Q4Что такое trace viewer и почему он важен?
Trace viewer — это запись прогона теста: каждое действие, снимок DOM до и после него, сетевые запросы, сообщения консоли, скриншоты и строка исходного кода. Его включают в конфиге, обычно trace on-first-retry, чтобы CI сохранял трейс каждый раз, когда тест упал хотя бы раз. Открыть его можно локально через npx playwright show-trace или на trace.playwright.dev и пошагово пройти падение, словно наблюдая из-за плеча пользователя. Он превращает отладку падений, которые случаются только в CI, в стиле «у меня работает» из часов в минуты — это одно из крупнейших практических преимуществ Playwright.
Q5Должны ли E2E-тесты мокать бэкенд?
В основном нет. Цель E2E-тестирования — проверить, что фронтенд, бэкенд и база данных работают вместе, поэтому мок собственного бэкенда превращает тест в более медленный компонентный тест. Мокайте то, что вы не контролируете и не можете надёжно запустить: сторонние платёжные страницы, аналитику, карты, почтовых провайдеров или нестабильный API партнёра. page.route в Playwright позволяет перехватывать такие запросы и возвращать фиксированные ответы или ошибки, что также отлично подходит для тестирования состояний ошибок. Для собственной системы наполняйте данные через тестовые API или фикстуры базы данных и запускайте тесты в выделенном окружении, которое можно сбросить.
Q6Playwright или Cypress?
Оба сильные. Cypress работает внутри браузера и предлагает очень отполированный интерактивный раннер, и многие команды хорошо его знают. Playwright управляет браузерами снаружи через их протоколы, что даёт нативную поддержку нескольких вкладок, нескольких origin, iframe, загрузок файлов и WebKit для покрытия Safari. Параллельное выполнение и шардирование встроены и бесплатны, а поддерживаются TypeScript, JavaScript, Python, Java и .NET. Для нового проекта в 2026 году я бы обычно выбрал Playwright за эту широту возможностей и скорость; для команды с большим и здоровым набором на Cypress миграция имеет смысл, только если его ограничения действительно мешают.
Вопросы уровня senior
S1Как организовать управление тестовыми данными для параллельного E2E-набора?
Параллельные тесты падают, когда делят изменяемое состояние, поэтому каждому тесту нужны собственные данные. Я предпочитаю создавать данные через тестовый API или фабрики, доступные в непродакшен-окружениях и обёрнутые в фикстуры, которые создают и убирают данные. Для дорогой подготовки worker-scoped фикстуры создают один аккаунт на worker с ключом по workerIndex. Общие справочные данные только для чтения, например каталог товаров, загружаются один раз на окружение. Уникальные идентификаторы (временные метки или UUID в email и именах) предотвращают коллизии. Окружение должно сбрасываться: идеально — эфемерная база данных на каждый пайплайн, иначе — ночной сброс. Компромисс — трудозатраты: тестовые API нужно защищать и отключать в продакшене, зато тесты становятся быстрее и гораздо надёжнее, чем при подготовке через UI.
S2Как решить, что относится к E2E, а что к более низким уровням тестов?
Я сопоставляю риск и стоимость. E2E-тесты лучше всего подходят для проверки интеграции всего стека в самых важных сценариях: выручка, безопасность и онбординг. Каждый такой сценарий получает один happy path и, возможно, один важный путь с ошибкой. Бизнес-правила с множеством комбинаций, например расчёт скидок, относятся к unit-тестам; API-контракты и поведение базы данных — к интеграционным; состояние UI и валидация — к компонентным. Полезное правило: если баг можно поймать только с настоящим браузером и настоящим бэкендом вместе, он заслуживает E2E-покрытия. Я также разбираю продакшен-инциденты: если баг проскочил, я добавляю тест на самом низком уровне, который поймал бы его, и поднимаюсь до E2E только при необходимости.
S3Как бы вы внедрили Playwright в команде с медленным и нестабильным набором на Selenium?
Я бы не переписывал всё сразу. Сначала измерьте текущий набор: длительность, долю нестабильных падений и то, какие тесты ловят реальные баги. Затем выберите пять самых ценных сценариев и реализуйте их на Playwright с локаторами по ролям, фикстурами, storageState и трейсами, запуская в CI рядом со старым набором. Покажите разницу в длительности и стабильности за несколько недель. Договоритесь о соглашениях в коротком гайде: приоритет локаторов, никаких фиксированных ожиданий, данные через API, page objects для общих страниц. Мигрируйте в порядке приоритета и удаляйте каждый тест на Selenium, как только его замена стала стабильной, вместо поддержки дубликатов. Главные риски — недооценка работы с тестовыми данными и кривой обучения, поэтому парное программирование и код-ревью тестов важны не меньше, чем сам инструмент.
Глоссарий
- End-to-end тест
- Тест, который проводит настоящее приложение через полный пользовательский флоу, от фронтенда до базы данных.
- Локатор
- Ленивое, вычисляемое заново описание того, как найти элемент на странице.
- Auto-waiting
- Playwright ждёт, пока элемент будет готов, прежде чем выполнить действие, без ручных пауз.
- Web-first assertion
- Проверка expect, которая повторяется, пока условие не выполнится или не истечёт таймаут.
- Browser context
- Изолированная сессия браузера со своими cookies и хранилищем, как новый профиль.
- Фикстура
- Переиспользуемый блок подготовки и очистки, который тест запрашивает по имени.
- storageState
- Сохранённые cookies и local storage, позволяющие запускать тесты уже залогиненными.
- Трейс
- Запись прогона теста с действиями, снимками DOM, сетью и логами консоли.
- Шардирование
- Разделение набора тестов на несколько машин для более быстрого выполнения.
- Flaky-тест
- Тест, который иногда проходит, а иногда падает без каких-либо изменений в коде.
Что изучить дальше
Есть идея продукта?Давайте создадим его.
Расскажите о своей идее, продукте или команде. Обычно отвечаю в течение одного рабочего дня.