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

为什么Cypress运行第三个it用例时会自动跳转回登录页面

问题根因

  • Cypress.Cookies.preserveOnce() 仅能保留下一次测试用例执行期间的Cookie,你仅在before钩子中调用了一次自定义保留Cookie命令,只能保证第一个it用例执行完后Cookie不被清除、第二个it用例可以正常拿到登录态;第二个it执行完后没有再次调用保留逻辑,第三个it执行前Cookie被Cypress默认清空,就会因为无登录态跳转回登录页。
  • 如果你的系统登录态同时存储在localStorage/sessionStorage中,仅保留Cookie无法完整保留登录状态,Cypress默认会在每个测试用例执行前清空站点存储数据。
  • 额外注意:你定义的自定义命令名preverseAllCookiesOnce存在拼写错误,正确拼写应为preserveAllCookiesOnce,不过你调用时用的是同一个错误拼写,所以不会触发命令未找到的报错,可以后续统一修正避免后续维护出问题。

修复方案

方案1:调整Cookie保留命令的调用时机

把保留Cookie的命令调用放到beforeEach钩子中,保证每次测试用例执行前都保留上一次的Cookie:

describe("Overview Page", () => {
  before("Behaviour to overview page", () => {
    cy.SignIn();
  });
  // 新增beforeEach钩子,每次执行it前保留cookie
  beforeEach(() => {
    cy.preverseAllCookiesOnce();
  });

  // 其余it测试代码保持不变
  it("Overview Page Check (Sidebar and Header)", () => {
    // 原有逻辑
  });

  it("Button Current and Dissmiss", () => {
    // 原有逻辑
  });

  it("Mapbox Button Check", () => {
    // 原有逻辑
  });
});

方案2:登录态存在存储中时,新增存储保留逻辑

修改自定义命令,同时保留Cookie和存储数据:

// command.js
let savedLocalStorage;
let savedSessionStorage;

Cypress.Commands.add("preserveLoginState", () => {
  // 保留Cookie
  cy.getCookies().then((cookies) => {
    const namesOfCookies = cookies.map((c) => c.name);
    Cypress.Cookies.preserveOnce(...namesOfCookies);
  });
  // 恢复localStorage
  if (savedLocalStorage) {
    Object.keys(savedLocalStorage).forEach(key => {
      window.localStorage.setItem(key, savedLocalStorage[key]);
    });
  }
  // 恢复sessionStorage
  if (savedSessionStorage) {
    Object.keys(savedSessionStorage).forEach(key => {
      window.sessionStorage.setItem(key, savedSessionStorage[key]);
    });
  }
  // 执行完当前用例后保存最新的存储数据
  afterEach(() => {
    savedLocalStorage = { ...window.localStorage };
    savedSessionStorage = { ...window.sessionStorage };
  });
});

之后在beforeEach中调用preserveLoginState()即可。

方案3(快速验证用):关闭Cypress的测试隔离

在cypress.config.js中添加testIsolation: false配置,关闭每个测试用例之间的环境自动清空逻辑,所有用例共享同一个浏览器上下文,登录态会全程保留:

// cypress.config.js 示例
const { defineConfig } = require('cypress')

module.exports = defineConfig({
  e2e: {
    testIsolation: false,
    // 其余原有配置保持不变
  }
})

该方案会关闭用例之间的环境隔离,不推荐在正式测试套件中长期使用,适合快速验证跳转问题是否由登录态丢失导致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:45:03