При написании тестов с использованием Playwright важным аспектом является правильное управление контекстом браузера, особенно когда речь идет об открытии новых страниц. Каждый браузер в Playwright работает в рамках контекста — среды, в которой происходят взаимодействия с веб-страницами, и эти контексты могут быть независимыми или общими. Важно понимать, как правильно управлять контекстами, чтобы обеспечить изолированность тестов, их предсказуемость и точность.
В Playwright контекст браузера — это независимая среда с собственными cookies, localStorage, сессиями и кешем. Он похож на концепцию «профиля» браузера, но в контексте тестирования используется для изоляции тестов, чтобы каждый тест не влиял на результаты других. Контексты могут быть использованы для эмуляции разных пользователей или сценариев взаимодействия.
Каждый браузер имеет один или несколько контекстов, и каждый контекст может содержать несколько страниц. Создание новых контекстов и работа с ними позволяют эффективно организовать тестирование и избегать конфликтов между тестами.
Для создания нового контекста в Playwright используется метод
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');
// Дальнейшие действия на странице
await browser.close();
})();
В данном примере создается новый контекст, затем в нем открывается страница, которая затем используется для взаимодействий с веб-страницей.
Когда контекст уже создан, можно открыть новые страницы в этом
контексте, используя метод context.newPage(). Это полезно,
когда необходимо тестировать несколько страниц в одном контексте
(например, эмулировать несколько вкладок или сценариев в одном
пользовательском сеансе).
Пример открытия нескольких страниц в одном контексте:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const context = await browser.newContext();
const page1 = await context.newPage();
await page1.goto('https://example.com');
const page2 = await context.newPage();
await page2.goto('https://playwright.dev');
// Дальнейшие действия с page1 и page2
await browser.close();
})();
Каждая страница в одном контексте будет иметь свою изолированную сессию, что позволяет избежать случайных пересечений в cookies или localStorage между вкладками.
Контексты также могут быть использованы для симуляции разных пользователей с различными состояниями браузера. Для этого можно создать несколько контекстов с разными настройками, например, с разными cookies или учетными записями.
Пример создания контекста для разных пользователей:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
// Контекст для первого пользователя
const context1 = await browser.newContext();
const page1 = await context1.newPage();
await page1.goto('https://example.com');
// Авторизация первого пользователя
await page1.fill('#username', 'user1');
await page1.fill('#password', 'password1');
await page1.click('button[type="submit"]');
// Контекст для второго пользователя
const context2 = await browser.newContext();
const page2 = await context2.newPage();
await page2.goto('https://example.com');
// Авторизация второго пользователя
await page2.fill('#username', 'user2');
await page2.fill('#password', 'password2');
await page2.click('button[type="submit"]');
await browser.close();
})();
В этом примере два пользователя, каждый в своем контексте, авторизуются на одном и том же сайте. Контексты изолированы, и действия одного пользователя не влияют на другого.
После завершения работы с контекстом его следует закрыть, чтобы
освободить ресурсы. Это можно сделать с помощью метода
context.close().
Пример закрытия контекста:
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');
await context.close(); // Закрытие контекста
await browser.close();
})();
Закрытие контекста автоматически завершает все страницы, открытые в рамках этого контекста, и очищает ресурсы, связанные с этим контекстом.
В Playwright можно настроить контекст с конкретными параметрами, такими как cookies, локальные данные, или устройства. Это позволяет более точно моделировать различные сценарии использования.
Пример настройки контекста с cookies:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const context = await browser.newContext({
cookies: [{ name: 'session_id', value: 'abcdef12345', domain: 'example.com' }]
});
const page = await context.newPage();
await page.goto('https://example.com');
await browser.close();
})();
В этом примере создается контекст с заданным cookie, которое может быть полезно при тестировании сессий или авторизации.
При запуске тестов в параллельном режиме можно использовать несколько контекстов одновременно для выполнения независимых сценариев. Это позволяет оптимизировать тестирование и ускорить процесс проверки.
Пример параллельного тестирования с несколькими контекстами:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
// Создание контекста для первого теста
const context1 = await browser.newContext();
const page1 = await context1.newPage();
await page1.goto('https://example.com');
// Создание контекста для второго теста
const context2 = await browser.newContext();
const page2 = await context2.newPage();
await page2.goto('https://playwright.dev');
await Promise.all([context1.close(), context2.close()]); // Параллельное закрытие контекстов
await browser.close();
})();
В данном примере два контекста работают параллельно, и их закрытие происходит одновременно. Это позволяет эффективно тестировать несколько сценариев в одном процессе.
Управление контекстом при открытии новых страниц в Playwright предоставляет тестировщикам мощный инструмент для изоляции сессий и управления состоянием браузера. Контексты позволяют тестировать различные сценарии взаимодействия с веб-приложениями, эмулировать работу нескольких пользователей и обеспечивать независимость тестов. Правильное использование контекстов значительно повышает эффективность тестирования, позволяя минимизировать пересечения данных и обеспечивать чистоту тестовой среды.