Cypress 11中POST登录beforeEach会话无法延续问题求助
Cypress 11中cy.request登录后会话不延续的解决方法
我在命令文件中编写了一个基于cy.request的登录脚本,在各测试规范文件的beforeEach中调用。该脚本在Cypress 9中可正常工作,但升级至Cypress 11后,登录请求执行成功,但后续测试仍处于未登录状态(停留在登录页面),导致用例失败。我的登录命令代码如下:
Cypress.Commands.add("login", () => { cy.request({ method: 'POST', url: '/Account/Login', // baseUrl is prepended to url form: true, // indicates the body should be form urlencoded and sets Content-Type: application/x-www-form-urlencoded headers body: { UserName: Cypress.env('username'), Password: Cypress.env('password'), RememberMe: false, FranchiseSelected: 1, } }) })
原因分析
Cypress 10+版本对浏览器会话和Cookie的处理机制进行了更新,原有的cy.request直接发送登录请求的方式,可能因为新版本的Cookie自动同步逻辑变化,导致请求返回的会话Cookie未能正确注入到测试的浏览器上下文,使得后续页面无法识别登录状态。
解决方法
方法1:使用Cypress官方推荐的cy.session管理会话
cy.session是Cypress 10+引入的会话管理API,专门用于保存和恢复登录状态,能确保会话在测试间正确延续,同时避免重复登录提升效率。
修改登录命令如下:
Cypress.Commands.add("login", () => { cy.session('user-login', () => { cy.request({ method: 'POST', url: '/Account/Login', form: true, body: { UserName: Cypress.env('username'), Password: Cypress.env('password'), RememberMe: false, FranchiseSelected: 1, } }).then(response => { // 可选:验证响应中是否返回会话Cookie expect(response.headers['set-cookie']).to.exist; }); }); });
在测试文件的beforeEach中依旧调用cy.login()即可,cy.session会自动处理会话的保存、恢复以及Cookie的注入。
方法2:手动同步登录响应中的Cookie
如果不想使用cy.session,可以手动从登录请求的响应头中提取Cookie,并设置到浏览器上下文里:
Cypress.Commands.add("login", () => { cy.request({ method: 'POST', url: '/Account/Login', form: true, body: { UserName: Cypress.env('username'), Password: Cypress.env('password'), RememberMe: false, FranchiseSelected: 1, } }).then(response => { const cookies = response.headers['set-cookie']; if (cookies) { cookies.forEach(cookieStr => { // 拆分Cookie的名称和值,忽略后续的属性(如expires、path等) const [cookiePair] = cookieStr.split(';'); const [name, value] = cookiePair.split('='); // 根据实际站点的Cookie属性配置参数 cy.setCookie(name.trim(), value.trim(), { domain: window.location.hostname, path: '/', secure: window.location.protocol === 'https:', httpOnly: true }); }); } // 可选:访问目标页面触发Cookie读取 cy.visit('/'); }); });
注意:这种方式需要准确匹配站点Cookie的属性(如domain、httpOnly等),否则Cookie设置可能无效。
额外检查
确保Cypress配置文件(cypress.config.js)中未禁用experimentalSessionAndOrigin特性,Cypress 11中该特性已默认启用,无需手动配置,若之前手动禁用需开启:
const { defineConfig } = require("cypress"); module.exports = defineConfig({ e2e: { experimentalSessionAndOrigin: true, // 其他配置项... }, });
内容的提问来源于stack exchange,提问作者Ray Gonzales
相关产品推荐
相关产品推荐

