Вы успешно вошли в свое приложение и прошли первый тест. Затем перешли к следующему тесту, нажали на него, но внезапно ваша сессия закончилась, и нужно снова пройти авторизацию. Почему 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?».
Пингбэк: Большой учебник по Cypress