Работа с cookies является неотъемлемой частью автоматизации тестирования веб-приложений с использованием Puppeteer. В ходе тестирования часто возникает необходимость в удалении кук — например, при подготовке среды для нового теста или для очистки данных сессии. Puppeteer предоставляет гибкие механизмы для работы с cookies, включая их удаление.
Cookies в браузере представляют собой маленькие фрагменты данных,
которые могут храниться на стороне клиента и использоваться для хранения
состояния сессии, предпочтений пользователя, а также для других целей. В
Puppeteer работа с cookies организована через объект page,
который предоставляет API для манипуляции cookies в браузере.
Для получения всех cookies на странице используется метод
page.cookies(), а для удаления cookies — метод
page.deleteCookie().
Чтобы работать с 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, чтобы не нарушать работу других сессий.
Для удаления конкретного 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 на странице, достаточно вызвать метод
page.deleteCookie() с массивом cookies. Обычно, если нужно
полностью очистить состояние сессии, удаляют все cookies.
Пример:
const cookies = await page.cookies();
await page.deleteCookie(...cookies); // Удаляет все cookies
Этот код работает следующим образом: он получает все cookies, а затем
передает их в метод deleteCookie. Так как метод
deleteCookie принимает несколько аргументов, передача
массива cookies распаковывается в отдельные элементы с помощью оператора
….
В тестировании автоматизация часто требует повторного выполнения сценариев в изолированных средах. В таких случаях может быть полезно удалить все cookies перед запуском каждого теста, чтобы избежать конфликтов между сессиями. Для этого можно использовать подход, представленный ниже.
Пример очистки cookies перед запуском теста:
beforeEach(async () => {
const cookies = await page.cookies();
await page.deleteCookie(...cookies); // Очищаем все cookies
});
Этот код выполнится перед каждым тестом, очищая cookies на странице и позволяя начать с чистого листа.
Для правильного завершения теста важно также удалять cookies, чтобы
сохранить чистоту среды для других тестов. Это можно сделать с помощью
метода afterEach.
Пример:
afterEach(async () => {
const cookies = await page.cookies();
await page.deleteCookie(...cookies); // Удаляем cookies после теста
});
Этот код гарантирует, что после выполнения теста все cookies будут удалены, предотвращая их влияние на будущие сценарии.
Проблемы с кросс-доменными cookies: Некоторые cookies
могут быть установлены на другом домене или с использованием
определённых флагов безопасности (например, HttpOnly,
Secure), что может ограничить возможность их удаления через
JavaScript.
Проблемы с несколькими путями (path): Если у одного и того же имени cookie разные пути, необходимо указать точный путь в объекте cookie, чтобы корректно удалить его.
Динамическое изменение 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,
что помогает обеспечивать изолированность тестов, их повторяемость и
стабильность.