Работа с куки — одна из важных составляющих при тестировании
веб-приложений с использованием Puppeteer. Куки позволяют хранить
сессии, состояния пользователей и другие данные, которые могут быть
необходимы для выполнения тестов. В Puppeteer управление куки
осуществляется через объект page, предоставляющий несколько
методов для работы с ними.
Чтобы управлять куки, сначала необходимо понимать, как их устанавливать
и получать в рамках тестирования. В Puppeteer куки можно задать для
текущей страницы, используя метод setCookie(), а также
получить куки через метод cookies().
Для того чтобы установить куки на странице, используется метод
page.setCookie(). Этот метод принимает один или несколько
объектов куки в качестве параметра. Каждый объект куки должен содержать
такие свойства, как name, value,
domain, path, expires,
httpOnly, secure и другие.
Пример установки куки:
await page.setCookie({
name: &
value: 'abcd1234',
domain: 'example.com',
path: '/',
httpOnly: true,
secure: true,
expires: Date.now() + 1000 * 60 * 60 // срок действия 1 час
});
В этом примере устанавливается кука user_session, которая
будет хранить строку сессии и действовать только на домене
example.com.
Можно передать массив объектов куки в метод setCookie(),
если нужно установить несколько кук сразу.
await page.setCookie(
{ name: 'user_session', value: 'abcd1234', domain: 'example.com' },
{ name: 'theme', value: 'dark', domain: 'example.com' }
);
Для получения всех кук, установленных на странице, используется метод
page.cookies(). Этот метод возвращает массив объектов куки,
где каждый объект содержит информацию о куке: имя, значение, домен, путь
и другие параметры.
const cookies = await page.cookies('https://example.com');
console.log(cookies);
Для удаления куки используется метод page.deleteCookie().
Он принимает объект куки или несколько объектов, которые должны быть
удалены.
await page.deleteCookie({ name: 'user_session', domain: 'example.com' });
Можно также удалить все куки сразу, вызвав метод без параметров.
await page.deleteCookie();
В ходе автоматизированного тестирования часто возникает необходимость передать кук между сессиями. Это может быть полезно для тестирования сценариев, где нужно сохранять состояние пользователя между запуском тестов.
Для этого можно сначала получить куки через метод
page.cookies(), а затем сохранить их в файл или переменную.
На следующем запуске теста эти куки можно будет установить на странице с
помощью метода page.setCookie().
Пример:
// Сохранение кук
const cookies = await page.cookies('https://example.com');
fs.writeFileSync('cookies.json', JSON.stringify(cookies));
// Загрузка кук
const cookies = JSON.parse(fs.readFileSync('cookies.json', 'utf8'));
await page.setCookie(...cookies);
Puppeteer позволяет работать с куки в разных контекстах, например, в разных вкладках или браузерах. Каждый контекст может иметь свои собственные куки, что полезно при тестировании работы с несколькими пользователями или с разными сеансами.
Если в тестах нужно работать с несколькими страницами, можно передавать
кук на каждую страницу с помощью метода setCookie() для
каждой страницы отдельно.
const page1 = await browser.newPage();
await page1.setCookie({ name: 'user_session', value: 'abcd1234', domain: 'example.com' });
const page2 = await browser.newPage();
await page2.setCookie({ name: 'theme', value: 'dark', domain: 'example.com' });
Для тестирования сессий, которые зависят от определенных HTTP-заголовков
(например, заголовков авторизации или других настроек сессии), может
потребоваться манипулировать куками в ответах от сервера. В таких
случаях необходимо будет использовать более низкоуровневые методы, такие
как перехват запросов и обработка заголовков через
page.setRequestInterception(true).
await page.setRequestInterception(true);
page.on('request', request => {
const cookies = request.headers()['cookie'] || '';
// Модификация или добавление нужных заголовков
request.continue({
headers: {
...request.headers(),
'cookie': cookies + '; user_session=abcd1234'
}
});
});
httpOnly,
чтобы предотвратить доступ к ним через JavaScript.
expires или
maxAge, они будут удалены, когда сессия браузера
завершится.
secure в куках
указывает, что кука должна передаваться только через защищённое
соединение (HTTPS).
Управление куками в Puppeteer — это мощный инструмент для тестирования веб-приложений. Возможность установки, получения, удаления и передачи кук между сессиями позволяет моделировать сложные сценарии поведения пользователей и тестировать их. Знание всех нюансов работы с куками дает возможность более точно моделировать реальные условия работы приложения и проводить эффективное тестирование.