Работа с файлами cookies в Cypress

Вы успешно вошли в свое приложение и прошли первый тест. Затем перешли к следующему тесту, нажали на него, но внезапно ваша сессия закончилась, и нужно снова пройти авторизацию. Почему Cypress выводит вас из системы после каждого теста?

Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ

Причина на самом деле проста. Cypress очищает состояние браузера в промежутках между тестами. Все ваши cookies (куки) удаляются из приложения между каждым it() блоком. Причина, по которой нужно опять войти в систему, может заключаться в том, что ваше приложение использует cookies для хранения токена аутентификации. Когда ваше приложение делает http-запрос к серверу, эти файлы куки будут отправлены вместе с ним. Таким образом, сервер знает, что ваша аутентификация действительна и что у вас есть права на чтение и запись данных. Если же cookies отсутствуют, сервер расценивает это как несанкционированный запрос, и приложение, как правило, выводит вас из системы.

Очистка состояния браузера – это, вообще-то, хорошая вещь, но бывают ситуации, когда она лишь усложняет и замедляет процесс тестирования. Например, вы хотите сгруппировать несколько тестов в одной спецификации, где каждый тест выполняется только после авторизации в системе. Давайте рассмотрим, какие варианты обхода постоянного удаления файлов cookies существуют. Чтобы разобраться с вопросом на практике, вы можете воспользоваться кодом из этого репозитория, в нем содержится простое приложение, в котором перечислены все имеющиеся файлы cookies.

В первом фрагменте кода видно, что мы устанавливаем куки для нашего приложения с помощью .setCookie() команды, но во втором тесте этого куки уже нет.

it('should show cookie', () => {
  cy.setCookie('authentication', 'top_secret');
  cy.visit('../../app/index.html');
});

it('opens a page', () => {
  cy.visit('../../app/index.html');
});

Запустив этот тест, вы увидите, что на второй странице отображается сообщение “cookies не найдены”.

Можно устанавливать cookies перед каждым тестом с помощью beforeEach хука:

beforeEach(() => {
  cy.setCookie('authentication', 'top_secret');
});

it('first test', () => {
  cy.visit('../../app/index.html');
});

it('second test', () => {
  cy.visit('../../app/index.html');
});

Однако делать это перед каждым тестом может быть довольно утомительным занятием, поэтому вместо использования beforeEach хука лучше применить другой подход. С помощью Cypress’ Cookies API можно установить cookies, которые никогда не будут удаляться. Используя Cypress.Cookies.defaults мы определяем, какие файлы cookie будут использованы в каждом тесте:

Cypress.Cookies.defaults({
  preserve: 'authentication'
})

it('first test', () => {
  cy.setCookie('authentication', 'top_secret');
  cy.visit('../../app/index.html');
});

it('second test', () => {
  cy.visit('../../app/index.html');
});

Вместо того чтобы использовать API в спецификации, можно объявить его в support/index.js файле проекта Cypress. Таким образом, вы будете уверены, что нужные cookies сохранятся во всех ваших тестах. Однако бывают ситуации, когда необходимо сохранить куки не для всего набора тестов, а только для одного файла спецификации.

Для этого также можно использовать API Cookies. Функция Cypress.Cookies.preserveOnce позволит сохранить определенный файл cookie для спецификации. В нашем следующем тесте before() хук служит для установки cookie, а beforeEach() хук — для вызова preserveOnce функции, чтобы сохранить нужный cookie для каждого теста:

before(() => {
  cy.setCookie('authentication', 'top_secret');
});

beforeEach(() => {
  Cypress.Cookies.preserveOnce('authentication')
});

it('first test', () => {
  cy.visit('../../app/index.html');
});

it('second test', () => {
  cy.visit('../../app/index.html');
});

Может показаться, что это не слишком отличается от простого использования beforeEach() для добавления куки перед тестами. Однако этот пример является весьма упрощенным. Чаще всего мы имеем дело не просто с установкой cookie в браузере, а с реальным входом в систему с помощью пользовательской команды или через API. Описанный выше метод позволит избежать повторного ввода команд для установки необходимых куки и значительно сэкономит время на подготовку к тестированию.

Перевод статьи «Cypress basics: Where did my cookies disappear?».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *