Изоляция процессов

Puppeteer предоставляет мощный инструмент для автоматизации браузера Chrome или Chromium через API на JavaScript. Одним из ключевых аспектов надежного тестирования является изоляция процессов, позволяющая запускать параллельные сценарии без взаимного влияния и обеспечивать стабильность тестов.


Контексты и страницы

В Puppeteer основными единицами изоляции являются браузерные контексты (BrowserContext) и страницы (Page).

  • Страница (Page) – отдельная вкладка браузера, имеющая собственный DOM, cookies, локальное хранилище и JavaScript-окружение.
  • Контекст браузера (BrowserContext) – изолированная область внутри одного экземпляра браузера. Каждый контекст содержит свои страницы, cookies, кэш и sessionStorage.

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

  • Запускать несколько независимых тестов в одном экземпляре браузера.
  • Избегать конфликта данных между тестами (например, авторизационных cookies).
  • Сократить время запуска, так как нет необходимости стартовать отдельный процесс браузера для каждого теста.

Пример создания изолированного контекста:

const browser = await puppeteer.launch(); const context = await browser.createIncognitoBrowserContext(); // инкогнито-контекст const page = await context.newPage();

await page.goto(&

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


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

Для запуска тестов параллельно важно создавать отдельные контексты для каждого сценария:

const contexts = [];
for (let i = 0; i < 5; i++) {
    const context = await browser.createIncognitoBrowserContext();
    const page = await context.newPage();
    await page.goto(`https://example.com/test${i}`);
    contexts.push({ context, page });
}

Такой подход гарантирует, что:

  • Cookies и localStorage одного теста не попадут в другой.
  • JavaScript на страницах разных тестов выполняется независимо.
  • Ошибки на одной странице не влияют на остальные.

Управление процессами

Puppeteer управляет процессами браузера через Node.js. При запуске:

  • Основной процесс Node.js создает процесс браузера.
  • Каждый контекст и страница используют отдельные BrowserContext-потоки, но находятся в одном процессе браузера.
  • Можно контролировать память и нагрузку, закрывая ненужные контексты после завершения тестов:
await context.close(); // освобождает ресурсы

Если нужно полностью изолировать тесты, можно запускать несколько экземпляров браузера:

const browser1 = await puppeteer.launch();
const browser2 = await puppeteer.launch();

Этот подход создаёт полностью отдельные процессы Chromium, что полезно для стресс-тестирования и сценариев с потенциальными утечками памяти.


Изоляция через пользовательские профили

Puppeteer позволяет указывать путь к профилю пользователя, что даёт возможность контролировать кэш, cookies и настройки:

const browser = await puppeteer.launch({
    userDataDir: './tmp/profile1'
});

Каждый путь userDataDir создаёт отдельный набор данных браузера. Это особенно важно для:

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

Практические рекомендации

  • Использовать инкогнито-контексты для полной изоляции при параллельных тестах.
  • Закрывать страницы и контексты после завершения тестов для экономии ресурсов.
  • Для тяжёлых тестов, требующих полной независимости, запускать отдельные экземпляры браузера.
  • Не хранить глобальные состояния внутри тестов — всё должно быть локально в контексте или странице.
  • Контролировать и логировать открытые процессы, чтобы избежать утечек памяти.

Мониторинг и отладка

Изоляция процессов позволяет проще выявлять ошибки:

  • Падение одной страницы не влияет на остальные контексты.
  • Можно отслеживать потребление ресурсов каждого контекста отдельно.
  • В сочетании с инструментами профилирования Chromium легко выявлять утечки памяти и блокировки.

Изоляция процессов в Puppeteer является фундаментальным инструментом для надёжного и масштабируемого тестирования веб-приложений, обеспечивая независимость сценариев, безопасное использование данных и оптимальное управление ресурсами браузера.