You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cypress测试套件POST请求后Cookie保留失效返回403问题

问题根因

403错误的核心原因是cy.request()不会自动将响应头中返回的新Cookie同步到浏览器的全局Cookie池,你配置的Cookie保留规则仅作用于测试用例切换时浏览器现有Cookie的清理过滤,无法覆盖cy.request环节的Cookie更新逻辑:

  • 登录后拿到的初始YII_CSRF_TOKEN、session值和当前会话绑定,POST请求触发后服务端通常会更新这两个值,新值只会存在于cy.request的响应对象中,不会自动同步到浏览器Cookie存储
  • 后续执行cy.visit()时,浏览器携带的还是旧的会话凭证,和服务端当前会话有效值不匹配,因此触发403权限错误

修复方案

方案1:全局覆盖cy.request自动同步Cookie

在cypress/support/commands.js中添加如下代码,全局实现cy.request响应Cookie自动同步到浏览器存储,不需要修改现有业务测试代码:

Cypress.Commands.overwrite('request', (originalFn, ...options) => {
  return originalFn(...options).then((response) => {
    // 自动同步响应返回的所有Set-Cookie到浏览器
    const setCookies = response.headers['set-cookie']
    if (setCookies) {
      setCookies.forEach(cookieStr => {
        const [name, value] = cookieStr.split(';')[0].split('=')
        cy.setCookie(name, value, { log: false })
      })
    }
    return response
  })
})

方案2:手动同步POST请求返回的Cookie

如果不想全局修改cy.request逻辑,可以在单个POST请求的回调中手动同步关键会话Cookie:

it('send POST/client request with correct values', function () {
  cy.request({
    method: 'POST',
    // 原有请求参数保持不变
  })
  .then(response => {
    expect(response.status).to.eq(200)
    // 手动同步更新的会话Cookie
    const setCookies = response.headers['set-cookie']
    if (setCookies) {
      setCookies.forEach(cookieStr => {
        const [name, value] = cookieStr.split(';')[0].split('=')
        if (['session', 'YII_CSRF_TOKEN'].includes(name)) {
          cy.setCookie(name, value)
        }
      })
    }
  })
})

验证建议

可以在POST请求执行后添加cy.getCookies().log()打印当前浏览器存储的Cookie值,和POST响应头中的Set-Cookie值对比,即可快速确认是否为Cookie不同步导致的问题。

内容的提问来源于stack exchange,提问作者cypher_null

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:24:07