Кипарисовая вырубка "X-CSRFToken" заголовок
Заметил, что Cypress тест бегун вырезает X-CSRFToken
из заголовка запроса, который вызывает запрос на возврат 403 Forbidden
, Вот скриншот заголовков из ручного запуска и пробного запуска Cypress,
Снимок экрана, сделанный во время навигации в браузере Chrome:
Снимок экрана, сделанный во время теста Cypress:
Чтобы подтвердить это, я повторил запрос через curl
прикрепление X-CSRFToken
, Это работало хорошо тогда. Как я мог справиться с этим во время выполнения тестов Cypress?
ПРИМЕЧАНИЕ. Это происходит при выполнении событий перетаскивания с использованием trigger()
функция
2 ответа
Просто наткнулся на эту проблему и смог ее решить:
Используйте команду, чтобы сохранить данные сеанса (файлы cookie) во время выполнения тестов. См. документацию кипариса .
Пример решения из моего приложения:
Cypress.Commands.add(
'login',
(username, password) => {
cy.session('user', () => { // <-- using command here
// First login request to DJANGO which sets
// Cookies (XSRF-TOKEN, session_id)
cy.request({
method: 'POST',
url: apiUrl,
headers: {
Accept: 'application/json, text/plain, */*',
},
body: {
password: pw,
username: user,
},
}).then((response) => {
const user = response.body.user
user.token = response.body.access_token
window.localStorage.setItem('auth.currentUser', JSON.stringify(user))
})
})
})
Тогда в моем тесте файлы cookie уже установлены:
it('Logs in as Premium User create a team and delete it', () => {
cy.login('user', 'password')
// do test requests which rely on XSRF-TOKEN being set here
})
Так как этоcy.session()
функция относительно новая, вам, возможно, придется установить флаг вcypress.config.ts
:
import { defineConfig } from 'cypress'
export default defineConfig({
e2e: {
experimentalSessionAndOrigin: true,
// ....
}
Надеюсь, это поможет кому-то :)
Cypress автоматически очищает файлы cookie между каждым тестом, поэтому, хотя вы правильно установили свои файлы cookie при входе в систему, они были бы отброшены сразу после этого.
it
(или же
specify
,
describe
или же
context
) блок закончен. Это означает, что любые последующие сетевые запросы будут иметь новое состояние (по замыслу).
Чтобы обойти это, вы можете использовать
Cypress.Cookies.preserveOnce
: https://docs.cypress.io/api/cypress-api/cookies.html#Preserve-Once
Вот как я использовал его, чтобы обойти аналогичную проблему:
beforeEach(() => {
Cypress.Cookies.preserveOnce('XSRF-TOKEN', 'session_id')
})
И если вы хотите поддерживать это состояние во всех своих тестовых наборах (например, отдельные
spec.js
файлы), вы можете поместить это в свой
cypress/support/index.js
файл:
Cypress.Cookies.defaults({
preserve: ['XSRF-TOKEN', 'session_id']
})