Управление headers и cookies через API

Cypress предоставляет мощные инструменты для работы с HTTP-запросами, включая возможность управлять заголовками (headers) и cookies. Это особенно важно при тестировании REST API, аутентификации, сохранении сессий и настройке кастомных параметров запросов.


Настройка заголовков (Headers)

В Cypress заголовки можно задавать как при глобальных конфигурациях, так и на уровне отдельных запросов.

Пример задания заголовков для одного запроса:

cy.request({
  method: 'GET',
  url: '/api/users',
  headers: {
    'Authorization': 'Bearer token123',
    'Content-Type': 'application/json'
  }
}).then((response) => {
  expect(response.status).to.eq(200);
  expect(response.body).to.have.property('users');
});

Ключевые моменты:

  • Authorization часто используется для передачи токенов.
  • Content-Type определяет формат данных запроса.
  • Заголовки можно динамически формировать, основываясь на данных из других тестов.

Глобальные заголовки

Для упрощения тестов часто задают заголовки глобально в cypress/support/commands.js или через Cypress.Commands.add.

Пример глобальной настройки заголовков:

Cypress.Commands.add('apiRequest', (method, url, body = {}) => {
  cy.request({
    method,
    url,
    body,
    headers: {
      'Authorization': `Bearer ${Cypress.env('API_TOKEN')}`,
      'Content-Type': 'application/json'
    }
  });
});

Использование:

cy.apiRequest('POST', '/api/login', { username: 'user', password: 'pass' });

Преимущество глобальных команд — единая точка изменения заголовков при обновлении токенов или типов контента.


Работа с cookies

Cypress позволяет как читать, так и устанавливать cookies, что необходимо для тестирования сессий и авторизации.

Сохранение cookie после логина:

cy.request({
  method: 'POST',
  url: '/api/login',
  body: { username: 'user', password: 'pass' }
}).then((response) => {
  expect(response.status).to.eq(200);
  cy.setCookie('session_id', response.body.session_id);
});

Чтение cookie:

cy.getCookie('session_id').then((cookie) => {
  expect(cookie.value).to.exist;
});

Удаление cookie:

cy.clearCookie('session_id');

Удаление всех cookie:

cy.clearCookies();

Передача cookies в запросах

Cookies могут быть автоматически переданы в последующих cy.request благодаря встроенному управлению сессиями, либо явно:

cy.getCookie('session_id').then((cookie) => {
  cy.request({
    method: 'GET',
    url: '/api/profile',
    headers: {
      'Content-Type': 'application/json'
    },
    cookies: {
      'session_id': cookie.value
    }
  }).then((response) => {
    expect(response.status).to.eq(200);
  });
});

Валидация заголовков и cookies в ответе

Cypress позволяет проверять, какие headers и cookies вернул сервер:

cy.request('/api/profile').then((response) => {
  expect(response.headers).to.have.property('content-type', 'application/json; charset=utf-8');
  expect(response.headers).to.have.property('x-rate-limit');
  expect(response.cookies).to.have.length.greaterThan(0);
});

Особенности:

  • response.headers — объект всех заголовков ответа.
  • response.cookies — массив cookies, установленных сервером.
  • Возможна проверка значения конкретного cookie через cy.getCookie.

Динамическая работа с headers и cookies

В реальных сценариях заголовки и cookies часто зависят от данных, полученных на предыдущих шагах теста:

cy.request('/api/get-token').then((res) => {
  const token = res.body.token;

  cy.request({
    method: 'GET',
    url: '/api/data',
    headers: {
      'Authorization': `Bearer ${token}`
    }
  }).then((response) => {
    expect(response.status).to.eq(200);
  });
});

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


Настройка глобальных cookies и headers через Cypress.Cookies.defaults

Для оптимизации тестов можно установить правила обработки cookies:

Cypress.Cookies.defaults({
  preserve: ['session_id', 'remember_token']
});

Это позволяет сохранять определённые cookies между тестами без необходимости повторного логина.


Интеграция с API и UI тестами

  • Headers и cookies из API-запросов могут использоваться для автоматического логина в UI.
  • После успешного API-запроса с токеном можно записать cookie и перейти к UI-тестам без необходимости ввода логина.

Пример:

cy.request('POST', '/api/login', { username: 'user', password: 'pass' })
  .then((res) => {
    cy.setCookie('session_id', res.body.session_id);
  });

cy.visit('/dashboard');
cy.contains('Welcome').should('be.visible');

Такой подход ускоряет тесты и уменьшает зависимость от UI.


Советы по надежной работе с headers и cookies

  1. Использовать переменные окружения для токенов и паролей (Cypress.env).
  2. Проверять статус ответа перед дальнейшей работой с cookies.
  3. При тестировании авторизации сохранять cookies между тестами через Cypress.Cookies.defaults.
  4. Явно указывать заголовки при каждом запросе для критичных API, чтобы избежать скрытых ошибок.

Эти возможности делают Cypress гибким инструментом для комплексного тестирования API и управления сессиями. Заголовки и cookies становятся ключевым инструментом при проверке аутентификации, авторизации и сценариев с динамическими данными.