В Cypress cookies используются для хранения информации о сессии пользователя, токенов аутентификации, предпочтений и других данных, необходимых для работы веб-приложения. Важной задачей в автоматизированном тестировании является сохранение состояния между тестами, чтобы избежать повторной авторизации или повторного выполнения одних и тех же действий.
Cypress предоставляет встроенные команды для управления cookies:
cy.setCookie(name, value, options) — установка cookie с
заданным именем и значением. Опции позволяют указать путь, домен, флаг
безопасности и срок действия.cy.getCookie(name) — получение конкретного cookie по
имени.cy.getCookies([filter]) — получение всех cookies или
выборки по фильтру.cy.clearCookie(name) и cy.clearCookies() —
удаление отдельных или всех cookies.cy.saveCookies() и cy.restoreCookies() —
нестандартные подходы через плагины для сохранения состояния между
тестами (не входят в стандарт Cypress).По умолчанию Cypress изолирует каждый тест, очищая cookies, localStorage и sessionStorage перед выполнением следующего теста. Это обеспечивает независимость тестов, но может быть неудобно, если требуется сохранение авторизации или других данных сессии.
Для сохранения cookies между тестами используются несколько подходов:
before и beforeEach
для установки состояния:before(() => {
cy.visit('/login');
cy.get('#username').type('admin');
cy.get('#password').type('password');
cy.get('button[type="submit"]').click();
cy.getCookies().then((cookies) => {
Cypress.env('savedCookies', cookies);
});
});
beforeEach(() => {
const cookies = Cypress.env('savedCookies');
if (cookies) {
cookies.forEach(cookie => {
cy.setCookie(cookie.name, cookie.value, {
domain: cookie.domain,
path: cookie.path,
secure: cookie.secure,
httpOnly: cookie.httpOnly,
});
});
}
});
В этом примере логин выполняется один раз в блоке
before, после чего cookies сохраняются в переменной
окружения Cypress и восстанавливаются перед каждым тестом.
cypress-session или
аналогичных подходов: Плагины позволяют управлять сессиями,
сохраняя cookies автоматически между тестами без ручного кода
восстановления. Это особенно удобно для больших тестовых наборов с
множеством сценариев, требующих авторизации.Для более тонкого контроля можно сохранять и восстанавливать только конкретные cookies, что уменьшает риск конфликтов:
cy.getCookie('session_id').then(cookie => {
Cypress.env('sessionCookie', cookie);
});
beforeEach(() => {
const cookie = Cypress.env('sessionCookie');
if (cookie) {
cy.setCookie(cookie.name, cookie.value);
}
});
Это позволяет сохранить только ключевую информацию, необходимую для поддержания авторизации, и избежать восстановления всех cookies, включая потенциально устаревшие или тестовые данные.
secure: при работе с локальным
сервером может потребоваться убрать secure при
восстановлении cookies.Cypress.Cookies.preserveOnce и
Cypress.Cookies.defaultsCypress предоставляет более удобные средства для автоматического сохранения cookies:
Cypress.Cookies.defaults({
preserve: ['session_id', 'auth_token']
});
Эта настройка позволяет сохранять указанные cookies между тестами без
явного восстановления в beforeEach.
Cypress.Cookies.preserveOnce('session_id') выполняет
аналогичную функцию для отдельных cookies в рамках текущего блока.
Соблюдение этих подходов позволяет эффективно управлять cookies в Cypress, обеспечивая повторяемость тестов и сокращая время выполнения за счет минимизации повторных входов и инициализации сессий.