Контексты браузера и изоляция

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

  1. Что такое контекст браузера?

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

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

  1. Создание и использование контекстов

Чтобы создать новый контекст, необходимо воспользоваться методом browser.createIncognitoBrowserContext(), который возвращает новый контекст браузера, изолированный от других. Такой контекст можно использовать для запуска новых страниц, что позволяет тестировать несколько пользователей или сессий без вмешательства в состояние других.

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

const browser = await puppeteer.launch(); const context = await
browser.createIncognitoBrowserContext(); const page = await
context.newPage(); await page.goto(&

В данном примере создается инкогнито-контекст, после чего открывается новая страница, которая будет использовать данные этого контекста, такие как cookies и сессии.

  1. Изоляция данных

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

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



const page1 = await context1.newPage(); await page1.goto('https://example.com/login'); await page1.type('#username', 'user1'); await page1.type('#password', 'password1'); await page1.click('#login');

const page2 = await context2.newPage(); await page2.goto('https://example.com/login'); await page2.type('#username', 'user2'); await page2.type('#password', 'password2'); await page2.click('#login');

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

  1. Преимущества использования контекстов

  • Независимость данных: Каждый контекст может иметь свои cookies, локальное хранилище, кеш, что позволяет изолировать сессии. Это особенно важно для тестирования различных пользователей или функционала, зависящего от состояния сессии.
  • Производительность: Запуск нескольких контекстов в одном экземпляре браузера может быть более производительным, чем запускать отдельные экземпляры браузера для каждой сессии.
  • Безопасность: Контексты предоставляют изоляцию данных, предотвращая утечку информации между тестами и сессиями.

  1. Контексты и многозадачность

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

Пример параллельного выполнения:

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


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

const [response1, response2] = await Promise.all([ page1.goto('https://example.com/page1'), page2.goto('https://example.com/page2')]);

console.log(await response1.text()); console.log(await response2.text());

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

  1. Управление контекстами

Контексты браузера в Puppeteer позволяют легко управлять ими, создавать и уничтожать по мере необходимости. После завершения работы с контекстом можно вызвать метод context.close(), который удаляет контекст и все страницы, связанные с ним:

await context.close();

Этот метод гарантирует, что все данные и ресурсы, связанные с контекстом, будут освобождены, и не возникнет утечек памяти.

  1. Изоляция между страницами

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

  1. Ожидания и изоляция

Одной из важных задач при тестировании является синхронизация с элементами страницы. При работе с несколькими контекстами и страницами необходимо правильно организовывать ожидания. Puppeteer предоставляет удобные средства для ожидания загрузки страниц, элементов и событий. Например, чтобы дождаться загрузки страницы, можно использовать метод page.waitForNavigation():

await page.waitForNavigation({ waitUntil: 'networkidle0' });

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

  1. Советы по работе с контекстами

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

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