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