BrowserContext API

BrowserContext — это изолированная среда браузера, которая позволяет создавать независимые сессии внутри одного экземпляра браузера. Каждая сессия имеет собственные куки, локальное хранилище, кэш и вкладки. Такой подход идеально подходит для параллельного тестирования и управления состояниями нескольких пользователей.


Создание и использование BrowserContext

Для создания нового контекста используется метод browser.newContext():

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const context = await browser.newContext();
  const page = await context.newPage();

  await page.goto('https://example.com');
  console.log(await page.title());

  await browser.close();
})();

Ключевые моменты:

  • Контексты полностью изолированы друг от друга.
  • Из одного контекста можно создавать несколько страниц (context.newPage()).
  • Контексты позволяют эмулировать разные пользователи в одном браузере.

Настройка контекста

newContext принимает объект с опциями для настройки:

const context = await browser.newContext({
  viewport: { width: 1280, height: 720 },
  userAgent: 'CustomUserAgent/1.0',
  locale: 'ru-RU',
  permissions: ['geolocation'],
  storageState: 'state.json'
});

Основные опции:

  • viewport — размеры окна страницы.
  • userAgent — пользовательский агент браузера.
  • locale — язык страницы.
  • permissions — разрешения для контекста (геолокация, уведомления и т. д.).
  • storageState — загрузка сохраненного состояния (куки и localStorage).

Сохранение и восстановление состояния

Для тестов с авторизацией полезно сохранять состояние контекста и повторно использовать его:

// Сохранение состояния
await context.storageState({ path: 'authState.json' });

// Восстановление состояния
const contextWithState = await browser.newContext({ storageState: 'authState.json' });
const page = await contextWithState.newPage();

Это позволяет избежать повторного прохождения авторизации при каждом запуске тестов.


Эмуляция устройств и геолокации

Playwright поддерживает эмуляцию мобильных устройств через devices:

const { devices } = require('playwright');
const iPhone = devices['iPhone 12'];

const context = await browser.newContext({
  ...iPhone,
  locale: 'en-US'
});
const page = await context.newPage();
await page.goto('https://example.com');

Геолокация:

const context = await browser.newContext({
  geolocation: { latitude: 55.7558, longitude: 37.6173 },
  permissions: ['geolocation']
});

Эмуляция устройств и геолокации позволяет тестировать адаптивный дизайн, мобильный функционал и локальные сервисы.


Работа с куки и localStorage

Контексты предоставляют API для работы с хранилищем:

// Получение куки
const cookies = await context.cookies();
console.log(cookies);

// Установка куки
await context.addCookies([{ name: 'token', value: 'abc123', domain: 'example.com', path: '/' }]);

// Очистка куки и хранилища
await context.clearCookies();
await context.clearPermissions();

Использование этих методов делает тесты более гибкими и позволяет управлять состоянием пользователя без перезапуска браузера.


Прослушивание событий контекста

Контексты могут отслеживать события для страниц, запросов и ошибок:

context.on('page', page => {
  console.log('Создана новая страница');
});

context.on('request', request => {
  console.log('Запрос:', request.url());
});

context.on('close', () => {
  console.log('Контекст закрыт');
});

Эти события помогают логировать действия и отлавливать проблемы в тестах.


Параллельное тестирование с контекстами

Создание нескольких контекстов позволяет запускать независимые сессии параллельно:

const context1 = await browser.newContext();
const context2 = await browser.newContext();

const page1 = await context1.newPage();
const page2 = await context2.newPage();

await Promise.all([
  page1.goto('https://example.com/user1'),
  page2.goto('https://example.com/user2')
]);

Каждый контекст работает автономно, что повышает стабильность тестов и исключает конфликты состояния.


Закрытие и очистка контекста

Контексты должны закрываться после использования, чтобы освобождать ресурсы:

await context.close();

Закрытие контекста автоматически закрывает все страницы внутри него и очищает память, что особенно важно при масштабных тестах с множеством параллельных сессий.


BrowserContext API обеспечивает мощные средства для изоляции тестовых сессий, управления состояниями и эмуляции различных условий. Это делает Playwright удобным инструментом для комплексного тестирования веб-приложений с высокой степенью контроля над браузерной средой.