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

