
Cypress 测试失败后残留的 Cookies 和本地存储常导致重跑失败,本文详解如何通过 cy.clearAllCookies()、testIsolation: true 及前置清理策略,实现全自动、可靠的状态重置,彻底告别手动清缓存。
cypress 测试失败后残留的 cookies 和本地存储常导致重跑失败,本文详解如何通过 `cy.clearallcookies()`、`testisolation: true` 及前置清理策略,实现全自动、可靠的状态重置,彻底告别手动清缓存。
在 Cypress 中,测试失败时 afterEach() 钩子不会执行——这是导致你无法自动清理 Cookies 的根本原因。一旦测试用例中断(如元素未找到、断言失败),后续的 cy.clearCookies() 和登出逻辑将被跳过,浏览器上下文中的认证态、会话 Cookie 和 localStorage 便会持续保留,造成下一次运行时页面加载异常或跳过登录流程。
✅ 正确做法是:将状态清理逻辑前移至 beforeEach(),并使用全域清理 API + 显式验证 + 启用测试隔离机制。
✅ 推荐配置与代码实践
describe('My Test Suite', { testIsolation: true }, () => {
beforeEach(() => {
// 1. 清除所有域名下的 cookies(推荐替代 cy.clearCookies())
cy.clearAllCookies();
cy.getAllCookies().should('be.empty'); // 确保异步清理完成
// 2. 清除所有 origin 的 localStorage 和 sessionStorage
cy.clearAllLocalStorage();
cy.getAllLocalStorage().should('be.empty');
cy.clearAllSessionStorage();
cy.getAllSessionStorage().should('be.empty');
// 3. ✅ 在清理完成后,再访问应用并登录(避免状态污染)
cy.fixture('login').then((data) => {
cy.visit(Cypress.config('baseUrl')); // 显式 visit,确保从干净页面开始
cy.login(data.UserName, data.Password);
});
});
it('Click on Project Inventory & verify Headers', () => {
CustPage.ProjectInventoryIcon().click();
// 添加必要断言,例如:
cy.url().should('include', '/inventory');
});
});⚠️ 关键注意事项
- testIsolation: true 是必选项(Cypress ≥ 12.0 默认启用):它确保每个测试用例在独立的浏览器上下文中运行,Cypress 会在测试开始前自动清理 cookies、storage、indexedDB 等——但*仍建议显式调用 `clearAll` 并验证**,以增强可调试性与跨版本兼容性。
- 禁用 cy.clearCookies():它仅清除当前域名 Cookie;而 cy.clearAllCookies() 才能清除所有已交互域名(如 SSO、OAuth 重定向域)的 Cookie,防止跨域会话残留。
- 勿在 afterEach() 中做关键清理:测试崩溃时该钩子不触发,无法兜底;所有“保障干净起点”的逻辑必须放在 beforeEach() 中。
- cy.visit() 必须在清理之后、登录之前调用:否则可能复用旧会话,绕过登录逻辑。
? 验证是否生效?
可在测试中临时添加调试语句:
cy.getAllCookies().then(cookies => console.log('Cookies after cleanup:', cookies));或在 Cypress 浏览器开发者工具 Application → Cookies 标签页中观察是否为空。
通过以上配置,无论测试成功或失败,下一次运行都将始于一个完全干净的浏览器环境——无需人工干预 Cypress Dashboard 中的缓存,大幅提升测试稳定性与开发效率。


















