Повторное использование контекстов браузера

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

Зачем нужно повторное использование контекстов?

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

Повторное использование контекстов позволяет:

  • Сэкономить время на создание и уничтожение контекста.
  • Работать с несколькими “пользователями” в рамках одного процесса.
  • Эмулировать тестирование с различными сессиями и данными.

Создание контекста браузера

Для начала работы с контекстами необходимо создать объект браузера и затем создать контекст. Используя Playwright, создание контекста выглядит следующим образом:

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

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

  // Тестовые действия с page...

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

Здесь создаётся новый контекст с помощью метода newContext(), а затем открывается новая страница (newPage()) в этом контексте.

Использование нескольких контекстов

Для более сложных сценариев, например, для моделирования работы нескольких пользователей, можно создать несколько контекстов и работать с ними параллельно. Каждый контекст будет содержать свои куки и локальные данные, что позволяет полностью изолировать состояние одного пользователя от другого.

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();
})();

В этом примере создаются два контекста — для двух пользователей, которые одновременно выполняют действия на одной и той же странице.

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

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

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 page.fill('#search', 'Playwright');
  await page.click('button[type="submit"]');

  // Сохранение контекста для повторного использования
  const newContext = context;

  // Повторное использование того же контекста
  const page2 = await newContext.newPage();
  await page2.goto('https://example.com/another-page');

  await browser.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/login');
  await page.fill('#username', 'user');
  await page.fill('#password', 'password');
  await page.click('button[type="submit"]');

  // Авторизация завершена, сохраняем контекст
  await context.storageState({ path: 'auth.json' });

  // Повторное использование контекста с авторизацией
  const newContext = await browser.newContext({ storageState: 'auth.json' });
  const newPage = await newContext.newPage();
  await newPage.goto('https://example.com/dashboard');

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

Здесь, после авторизации, состояние контекста сохраняется в файл auth.json. В дальнейшем можно повторно использовать этот файл для создания нового контекста с уже авторизованным пользователем.

Управление памятью и производительностью

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

Оптимальным подходом является использование одного контекста для группы тестов, которые требуют схожих условий, и создание новых контекстов только в тех случаях, когда это действительно необходимо. Например, при эмуляции нескольких пользователей или при тестировании с различными данными.

Завершение работы с контекстами

По завершению тестов важно корректно завершать работу с контекстами и браузером. Playwright позволяет легко закрыть все страницы и контексты:

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

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

  // Тестовые действия...

  // Закрытие страницы и контекста
  await page.close();
  await context.close();
  await browser.close();
})();

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

Резюме

Повторное использование контекстов в Playwright — это эффективный способ работы с несколькими изолированными сессиями в одном процессе браузера. Это помогает экономить ресурсы, ускорять выполнение тестов и проводить более реалистичные сценарии с различными пользователями или состояниями. Работа с контекстами позволяет эмулировать реальные условия эксплуатации приложений, что делает тестирование более точным и масштабируемым.