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
相关产品推荐
相关产品推荐

