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

如何在Cypress中完全清除会话?解决会话恢复超时问题

解决Cypress会话恢复超时问题

问题根源

Cypress 12+版本默认启用了experimentalSessionAndOrigin特性,当你通过cy.request完成登录后,它会自动创建会话快照并尝试在后续测试中复用。但第一个测试中通过界面执行注销操作后,后端已销毁对应会话,此时Cypress仍尝试恢复失效的会话快照,最终导致超时并重新创建会话。单纯清除前端存储(Cookies、LocalStorage等)无法完全阻断Cypress的会话恢复逻辑。

解决方案

1. 用cy.session封装登录并控制缓存策略

将登录逻辑封装到cy.session中,通过配置禁用跨测试会话缓存,同时添加会话有效性校验,快速判断是否需要重新登录,避免超时:

beforeEach(() => {
  // 前置清除所有会话相关存储
  cy.clearAllCookies();
  cy.clearAllLocalStorage();
  cy.clearAllSessionStorage();

  cy.session('user-login', () => {
    // 执行登录请求
    cy.request({
      method: 'POST',
      url: `${URL}/sessions`,
      body: {
        userName: 'xxx',
        password: 'yyy',
      },
    });
  }, {
    cacheAcrossSpecs: false, // 禁止跨测试用例缓存会话
    validate: () => {
      // 自定义会话有效性校验,快速判断是否需要重新登录
      cy.request({
        url: `${URL}/api/current-user`, // 替换为你的登录状态校验接口
        failOnStatusCode: false
      }).then(resp => {
        return resp.status === 200;
      });
    }
  });
});

2. 测试后主动销毁后端会话

在每个测试结束后,主动调用后端注销接口彻底销毁会话,配合清除前端存储,确保下一个测试前无残留会话:

afterEach(() => {
  // 清除前端存储
  cy.clearAllCookies();
  cy.clearAllLocalStorage();
  cy.clearAllSessionStorage();
  
  // 调用后端注销接口(替换为实际接口)
  cy.request({
    method: 'POST',
    url: `${URL}/logout`,
    failOnStatusCode: false
  });
});

3. 禁用Cypress会话快照特性

在cypress.config.js中关闭experimentalSessionAndOrigin,彻底禁用自动会话恢复逻辑:

const { defineConfig } = require('cypress');

module.exports = defineConfig({
  e2e: {
    experimentalSessionAndOrigin: false, // 关闭会话快照特性
    // 其他配置项...
  },
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:55:20