Установка и получение cookies

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

Основные методы работы с cookies

В Cypress доступны несколько основных команд для работы с cookies:

  • cy.setCookie(name, value, options) — установка cookie.
  • cy.getCookie(name) — получение конкретного cookie по имени.
  • cy.getCookies([filter]) — получение всех cookies или выборочных по фильтру.
  • cy.clearCookie(name) — удаление конкретного cookie.
  • cy.clearCookies([filter]) — удаление всех cookies или выборочных по фильтру.

Установка cookie производится с помощью метода cy.setCookie. Он принимает обязательные параметры name и value, а также объект options, в котором можно задать дополнительные свойства:

cy.setCookie('session_id', '123ABC', {
  domain: 'example.com',
  path: '/',
  secure: true,
  httpOnly: true,
  expiry: Math.floor(Date.now() / 1000) + 3600
});

Пояснение параметров:

  • domain — домен, для которого действует cookie.
  • path — путь, на котором cookie доступно.
  • secure — устанавливает cookie только для HTTPS-соединений.
  • httpOnly — запрещает доступ к cookie через JavaScript в браузере.
  • expiry — время жизни cookie в секундах с 1970 года (Unix Timestamp).

Важно учитывать, что Cypress автоматически очищает cookies перед каждым тестом. Для сохранения состояния между тестами используется настройка preserve в Cypress.Cookies.defaults():

Cypress.Cookies.defaults({
  preserve: 'session_id'
});

Для проверки значений cookie используется метод cy.getCookie(name), который возвращает объект cookie с полями: name, value, domain, path, secure, httpOnly, expiry.

Пример получения cookie и проверки его значения:

cy.getCookie('session_id').should('have.property', 'value', '123ABC');

Для получения всех cookies используется cy.getCookies():

cy.getCookies().then((cookies) => {
  cookies.forEach(cookie => {
    cy.log(`${cookie.name}: ${cookie.value}`);
  });
});

Метод также поддерживает фильтр по имени или регулярному выражению:

cy.getCookies(['session_id', 'user_pref']).then((cookies) => {
  // работа с конкретными cookies
});

Удаление конкретного cookie осуществляется через cy.clearCookie(name):

cy.clearCookie('session_id');

Удаление всех cookies или выборочных — через cy.clearCookies([filter]):

cy.clearCookies();
cy.clearCookies(['user_pref']);

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

Практическое применение

  1. Сохранение состояния аутентификации: при логине можно сохранить cookie с сессией и использовать её в последующих тестах.
  2. Тестирование пользовательских предпочтений: изменения настроек интерфейса можно сохранять в cookie и проверять при повторной загрузке страницы.
  3. Моделирование разных пользователей: установка разных cookie позволяет эмулировать различные роли без повторной авторизации.

Настройка автоматического сохранения cookies

Cypress позволяет глобально сохранять или очищать cookie с помощью Cypress.Cookies.defaults(). Пример настройки для сохранения нескольких cookies между тестами:

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

Можно также исключать определённые cookie из автоматического сохранения, используя функцию:

Cypress.Cookies.defaults({
  preserve: (cookie) => cookie.name !== 'tracking_id'
});

Эта гибкость позволяет точно управлять состоянием приложения и предотвращает лишние очистки cookies, что критично при сложных сценариях тестирования.

  • Все операции с cookie выполняются асинхронно, но Cypress автоматически ждёт завершения команды.
  • Cookies, установленные на уровне HTTP-заголовков, также доступны через cy.getCookie, если они соответствуют текущему домену.
  • Для тестирования нескольких доменов требуется использование cy.request для установки cookie на целевой домен, так как cy.setCookie работает только с текущим доменом теста.

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