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']
});
Эмуляция устройств и геолокации позволяет тестировать адаптивный дизайн, мобильный функционал и локальные сервисы.
Контексты предоставляют 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 удобным инструментом для комплексного тестирования веб-приложений с высокой степенью контроля над браузерной средой.