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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 16:20:30