Установка кук

Работа с куки — одна из важных составляющих при тестировании веб-приложений с использованием 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' });

Работа с cookies на основе HTTP-заголовков

Для тестирования сессий, которые зависят от определенных 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 — это мощный инструмент для тестирования веб-приложений. Возможность установки, получения, удаления и передачи кук между сессиями позволяет моделировать сложные сценарии поведения пользователей и тестировать их. Знание всех нюансов работы с куками дает возможность более точно моделировать реальные условия работы приложения и проводить эффективное тестирование.