Puppeteer предоставляет мощные возможности для автоматизации веб-приложений, и работа с куками в запросах является важной частью тестирования, особенно когда требуется учитывать состояние сессий, авторизацию или другие параметры, зависимые от хранения куки.
С помощью Puppeteer можно легко управлять куками, получая их из текущей страницы, а также добавляя новые или изменяя существующие. Работать с куками можно на уровне браузера или для конкретной страницы.
Для получения всех куков, связанных с текущей страницей, используется
метод page.cookies(). Он возвращает массив объектов,
содержащих информацию о куках, таких как имя, значение, домен, путь,
флаг безопасности и другие.
const cookies = await page.cookies();
console.log(cookies);
Этот метод позволяет получить куки из всех доменов, которые были
загружены на текущей странице. Для получения куков только с
определенного домена, можно передать в метод page.cookies()
URL.
const cookies = await page.cookies(&
console.log(cookies);
Для добавления или изменения куков используется метод
page.setCookie(). Он принимает объект с параметрами, такими
как name, value, domain,
path, secure, httpOnly и другие.
При добавлении новых куков Puppeteer автоматически применяет их к
текущей сессии браузера.
Пример установки куков:
await page.setCookie({
name: 'session_id',
value: 'abc123',
domain: 'example.com',
path: '/',
secure: true,
httpOnly: true
});
Важно учитывать, что куки необходимо устанавливать перед навигацией на страницу, так как после загрузки страницы они могут быть перезаписаны сервером.
Для тестирования веб-приложений важно понимать, как куки могут влиять на различные сценарии, такие как авторизация пользователей или управление сессиями.
Один из популярных сценариев использования куков — эмуляция авторизованных пользователей. При автоматическом тестировании часто возникает необходимость протестировать поведение сайта для пользователя, который уже вошел в систему.
Для этого можно установить соответствующие куки, которые определяют состояние сессии. Пример:
const cookies = [
{
name: 'auth_token',
value: 'your-auth-token-value',
domain: 'example.com',
path: '/',
secure: true,
httpOnly: true
}
];
await page.setCookie(...cookies);
await page.goto('https://example.com/dashboard');
В этом примере с помощью куки эмулируется состояние авторизации, и страница загружается с учетом этого.
Удаление куков можно осуществить с помощью метода
page.deleteCookie(), который принимает объект куки с полями
name и domain (опционально можно указать
path).
await page.deleteCookie({ name: 'auth_token', domain: 'example.com' });
Этот метод полезен для очистки состояния сессии, например, в тестах, когда необходимо проверить поведение сайта при отсутствии авторизации.
В процессе тестирования может возникнуть потребность в повторном использовании куков между различными сессиями или запусками тестов. Для этого можно сохранить куки в файл и загрузить их в другой сессии.
Для сохранения текущих кук в файл можно использовать fs
(файловую систему Node.js) для записи данных в JSON формат.
const fs = require('fs');
const cookies = await page.cookies();
fs.writeFileSync('cookies.json', JSON.stringify(cookies));
Для загрузки кук из файла и их последующей установки можно использовать следующий код:
const fs = require('fs');
const cookies = JSON.parse(fs.readFileSync('cookies.json'));
await page.setCookie(...cookies);
Эта техника полезна для ускорения тестов, так как не требует повторной авторизации или других длительных процессов, связанных с установкой состояния сессии.
В некоторых случаях сайт требует авторизации через формы или OAuth. В таких ситуациях полезно работать с куками после прохождения авторизации, чтобы ускорить тесты. Однако важно учитывать, что куки могут иметь срок действия, который истекает, поэтому необходимо регулярно обновлять их или предусматривать логику повторной авторизации в тестах.
Для авторизации можно использовать Puppeteer для взаимодействия с элементами страницы, такими как поля ввода и кнопки, для автоматического прохождения процесса авторизации и получения нужных кук.
Пример автоматической авторизации:
await page.goto('https://example.com/login');
await page.type('#username', 'your-username');
await page.type('#password', 'your-password');
await page.click('#login-button');
await page.waitForNavigation();
const cookies = await page.cookies();
console.log(cookies);
После выполнения авторизации можно сохранить куки и использовать их в дальнейших тестах.
Puppeteer также поддерживает работу с контекстами (pages, browsers), что позволяет использовать куки в разных контекстах без взаимного влияния. Каждый контекст может иметь свои куки, сессии и состояние, что важно для тестирования многопользовательских приложений или различных сценариев работы с веб-сайтами.
const context = await browser.createIncognitoBrowserContext();
const page = await context.newPage();
await page.setCookie({
name: 'user_id',
value: 'unique-id',
domain: 'example.com'
});
await page.goto('https://example.com/profile');
Этот подход полезен для изоляции различных тестов и исключения взаимодействия между ними.
secure для обеспечения безопасности передачи куков и
httpOnly для защиты от XSS-атак.
Работа с куками является важной частью тестирования, так как помогает создавать стабильные и надежные автоматические сценарии для тестирования веб-приложений, имитируя реальное поведение пользователей.