Кипарисовая вырубка "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']
})
Другие вопросы по тегам