Работа с куками в запросах

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);

Эта техника полезна для ускорения тестов, так как не требует повторной авторизации или других длительных процессов, связанных с установкой состояния сессии.

Работа с куками в условиях авторизации с помощью Puppeteer

В некоторых случаях сайт требует авторизации через формы или 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');

Этот подход полезен для изоляции различных тестов и исключения взаимодействия между ними.

Важные моменты при работе с куками

  1. Проверка сроков действия: Некоторые куки могут иметь срок действия, и важно следить за их актуальностью. Если куки устарели, их необходимо обновить.
  2. Секретность и безопасность: При работе с куками важно соблюдать меры безопасности, такие как использование флага secure для обеспечения безопасности передачи куков и httpOnly для защиты от XSS-атак.
  3. Куки и различные домены: Куки могут быть привязаны к конкретному домену, и при переходе на другой домен они не будут доступны. Это важно учитывать при работе с сайтами, использующими несколько поддоменов или редиректы.

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