Фикстуры Playwright

Фикстуры — это готовые объекты, которые Playwright подаёт в тест: страница, контекст, браузер.

Фикстура (fixture) — это объект, который раннер создаёт и подготавливает для теста, а после теста убирает за собой. Вы получаете её, просто указав имя в аргументах.

Как фикстуры попадают в тест

Помните async ({ page }) => {...}? Здесь page — фикстура. Вы перечисляете нужные фикстуры в фигурных скобках, и Playwright сам их создаёт перед тестом и уничтожает после. Это избавляет от ручного запуска и закрытия браузера, а заодно гарантирует, что за собой всё будет убрано даже при падении теста.

test('пример с несколькими фикстурами', async ({ page, context, browser }) => {
  // page    — одна вкладка
  // context — изолированная сессия (как окно в режиме инкогнито)
  // browser — сам экземпляр браузера
});

Три встроенные фикстуры

ФикстураЧто этоИзоляция
pageвкладка браузерановая на каждый тест
contextсессия: cookie, storage, правановый на каждый тест
browserэкземпляр браузераобщий на воркер

Иерархия такая: один browser содержит несколько context (изолированных сессий), а каждый context — несколько page (вкладок). Для большинства тестов хватает page.

Зачем нужен context

Context — это как отдельное окно в режиме инкогнито: свои cookie, своё хранилище, ничего не разделяется с другими. Это основа изоляции тестов. Если нужно проверить взаимодействие двух пользователей (например, чат), создают два контекста — каждый со своей сессией.

test('два пользователя в чате', async ({ browser }) => {
  const aliceContext = await browser.newContext();
  const bobContext = await browser.newContext();

  const alice = await aliceContext.newPage();
  const bob = await bobContext.newPage();

  await alice.goto('/chat');
  await bob.goto('/chat');
  // ... Алиса пишет, Боб видит сообщение
});

Свои фикстуры

Можно создавать собственные фикстуры и переиспользовать их во всех тестах. Например, фикстуру «уже залогиненная страница», чтобы не повторять вход. Расширяют базовый test через test.extend.

import { test as base } from '@playwright/test';

export const test = base.extend({
  loggedInPage: async ({ page }, use) => {
    await page.goto('/login');
    await page.getByLabel('Email').fill('[email protected]');
    await page.getByLabel('Пароль').fill('secret');
    await page.getByRole('button', { name: 'Войти' }).click();
    await use(page);  // отдаём подготовленную страницу тесту
  },
});

Теперь любой тест может попросить loggedInPage и сразу оказаться внутри личного кабинета:

test('видит заказы', async ({ loggedInPage }) => {
  await loggedInPage.goto('/orders');
  await expect(loggedInPage.getByRole('heading', { name: 'Мои заказы' })).toBeVisible();
});

Часть до use() — это подготовка, после — очистка. Это мощный механизм переиспользования: вместо хуков, разбросанных по файлам, у вас один источник правды, который любой тест подключает по имени. Этот приём мы разовьём в уроке про авторизацию.

Итог

  • Фикстура — готовый объект, который раннер создаёт перед тестом и убирает после.
  • Встроенные: page (вкладка), context (сессия), browser (браузер).
  • Иерархия: browser → context → page; для большинства тестов хватает page.
  • Свои фикстуры через test.extend переиспользуют подготовку (например, авторизацию).
Проверьте себя
1. Что такое фикстура page в Playwright?
AФайл конфигурации теста
BВкладка браузера, которую раннер создаёт для теста и убирает после
CСписок всех тестов проекта
DГлобальная переменная окружения
2. Какова иерархия встроенных фикстур?
Apage → context → browser
Bbrowser содержит context, context содержит page
Ccontext содержит browser
Dpage содержит browser и context
3. Зачем создают собственные фикстуры через test.extend?
AЧтобы ускорить браузер
BЧтобы переиспользовать подготовку, например уже залогиненную страницу
CЧтобы отключить авто-ожидания
DЧтобы запретить параллельный запуск
Поддержать проект