Удаление кук

Работа с cookies является неотъемлемой частью автоматизации тестирования веб-приложений с использованием Puppeteer. В ходе тестирования часто возникает необходимость в удалении кук — например, при подготовке среды для нового теста или для очистки данных сессии. Puppeteer предоставляет гибкие механизмы для работы с cookies, включая их удаление.

Основы работы с cookies в Puppeteer

Cookies в браузере представляют собой маленькие фрагменты данных, которые могут храниться на стороне клиента и использоваться для хранения состояния сессии, предпочтений пользователя, а также для других целей. В Puppeteer работа с cookies организована через объект page, который предоставляет API для манипуляции cookies в браузере.

Для получения всех cookies на странице используется метод page.cookies(), а для удаления cookies — метод page.deleteCookie().

Получение всех cookies на странице

Чтобы работать с cookies, прежде чем их удалять, важно понять, какие именно куки установлены в текущем сеансе. Это можно сделать с помощью метода page.cookies().

const cookies = await page.cookies();
console.log(cookies);

Этот код возвращает массив объектов cookies, каждый из которых содержит ключи, такие как name, value, domain, path, и другие параметры. Эти данные могут быть полезны для диагностики проблемы с состоянием сессии или для проверки, какие куки необходимо удалить.

Удаление кук на странице

Для удаления куки из текущей страницы или сессии используется метод page.deleteCookie(). Этот метод принимает в качестве аргумента объект cookie, который нужно удалить. Структура объекта cookie должна совпадать с теми, которые возвращаются методом page.cookies().

Пример удаления одного cookie:

const cookies = await page.cookies();
await page.deleteCookie(...cookies); // Удаляем все куки

Этот код удалит все cookies, полученные методом page.cookies(). Однако, обычно удаляют только определенные cookies, чтобы не нарушать работу других сессий.

Удаление отдельных cookies

Для удаления конкретного cookie нужно передать в метод deleteCookie объект, содержащий идентификаторы нужного cookie (например, name, domain, path).

Пример:

const cookies = await page.cookies();
const cookieToDelete = cookies.find(cookie => cookie.name === &
if (cookieToDelete) {
  await page.deleteCookie(cookieToDelete);
}

Здесь ищется cookie с именем myCookie, и если оно найдено, то выполняется его удаление.

Удаление всех cookies на странице

Чтобы удалить все cookies на странице, достаточно вызвать метод page.deleteCookie() с массивом cookies. Обычно, если нужно полностью очистить состояние сессии, удаляют все cookies.

Пример:

const cookies = await page.cookies();
await page.deleteCookie(...cookies); // Удаляет все cookies

Этот код работает следующим образом: он получает все cookies, а затем передает их в метод deleteCookie. Так как метод deleteCookie принимает несколько аргументов, передача массива cookies распаковывается в отдельные элементы с помощью оператора .

Очистка cookies перед началом нового теста

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

Пример очистки cookies перед запуском теста:

beforeEach(async () => {
  const cookies = await page.cookies();
  await page.deleteCookie(...cookies); // Очищаем все cookies
});

Этот код выполнится перед каждым тестом, очищая cookies на странице и позволяя начать с чистого листа.

Удаление cookies после завершения теста

Для правильного завершения теста важно также удалять cookies, чтобы сохранить чистоту среды для других тестов. Это можно сделать с помощью метода afterEach.

Пример:

afterEach(async () => {
  const cookies = await page.cookies();
  await page.deleteCookie(...cookies); // Удаляем cookies после теста
});

Этот код гарантирует, что после выполнения теста все cookies будут удалены, предотвращая их влияние на будущие сценарии.

Особенности удаления cookies

  1. Проблемы с кросс-доменными cookies: Некоторые cookies могут быть установлены на другом домене или с использованием определённых флагов безопасности (например, HttpOnly, Secure), что может ограничить возможность их удаления через JavaScript.

  2. Проблемы с несколькими путями (path): Если у одного и того же имени cookie разные пути, необходимо указать точный путь в объекте cookie, чтобы корректно удалить его.

  3. Динамическое изменение cookies: После выполнения удаления cookies важно убедиться, что состояние страницы обновилось. Иногда требуется подождать, пока удаление cookies не повлияет на работу страницы (например, страницы, где куки контролируют отображение данных).

Удаление cookies с разных контекстов браузера

В случае использования нескольких контекстов или окон в одном экземпляре браузера в Puppeteer, важно помнить, что cookies привязаны к контексту страницы. Если нужно удалить cookies в определённом контексте, необходимо получить доступ к cookies этого контекста через метод context.cookies().

Пример:

const context = await browser.createIncognitoBrowserContext();
const page = await context.newPage();
const cookies = await page.cookies();
await page.deleteCookie(...cookies);

Здесь cookies будут удалены только для текущего инкогнито контекста.

Заключение

Удаление cookies в Puppeteer является важной частью управления состоянием сеанса в процессе автоматизированного тестирования веб-приложений. Использование методов page.cookies() и page.deleteCookie() позволяет гибко манипулировать cookies, что помогает обеспечивать изолированность тестов, их повторяемость и стабильность.