不使用cy.session()时如何在Cypress全测试用例中保存指定Cookie
Cypress v12+ 版本默认开启测试隔离,会在每个用例执行前清空全部浏览器上下文,导致旧版Cypress.Cookies.defaults({ preserve: 'cookie_name' })、Cypress.Cookies.preserveOnce('cookie_name')的常规写法失效,以下是适配动态自定义访问地址、无需依赖cy.session()的落地方案:
方案1:修正preserve注册位置(最低改造成本)
旧方法失效的核心原因是preserve注册时机不对,只要在全局支持文件的最顶层beforeEach钩子中注册要保留的Cookie,即可绕过默认清理逻辑,适配任意动态访问地址:
// 写入 cypress/support/e2e.js 全局生效 beforeEach(() => { // 固定名称的Cookie直接填入数组 const staticPreserveCookies = ['auth_token', 'user_uid'] staticPreserveCookies.forEach(cookieName => Cypress.Cookies.preserveOnce(cookieName)) // 动态名称/和表单、用户绑定的Cookie,用正则匹配批量保留 cy.getCookies().then(cookieList => { cookieList.forEach(cookie => { // 例:保留所有以form_access_、user_perm_开头的业务Cookie if (/^(form_access_|user_perm_)/.test(cookie.name)) { Cypress.Cookies.preserveOnce(cookie.name) } }) }) })
注意:用例中不要调用无参数的cy.clearCookies()全量清理Cookie,如需清理无关Cookie,需指定具体Cookie名定向删除。
方案2:手动缓存回填Cookie(最高可控性)
如果项目中存在全局全量清Cookie的逻辑、或Cookie绑定动态域名/路径,可绕开框架自带的preserve逻辑,手动缓存Cookie并在每个用例加载对应地址后回填,完全不受框架清理规则限制:
// 1. 首次获取到目标Cookie后,存入Cypress环境变量缓存 // 例:登录完成、或进入表单访问地址拿到权限Cookie后执行 cy.getCookie('form_access_xxx').then(cookie => { // 多用户、多表单场景可改为对象结构存储,key对应用户/表单标识 Cypress.env('cachedCookies', { ...Cypress.env('cachedCookies'), [formId]: cookie }) }) // 2. 全局beforeEach中,访问对应业务地址后回填Cookie beforeEach(() => { // 等待当前测试地址加载完成,避免Cookie域不匹配 cy.location('href').then(() => { const cachedCookies = Cypress.env('cachedCookies') || {} Object.values(cachedCookies).forEach(cookie => { cy.setCookie(cookie.name, cookie.value, { domain: cookie.domain, path: cookie.path, httpOnly: cookie.httpOnly, secure: cookie.secure }) }) }) })
该方案无需固定访问入口,完全适配每个用户、每个表单对应独立自定义地址的场景。
方案3:关闭全局测试隔离(最省事)
如果测试套件不需要用例间的状态隔离,可直接修改配置关闭默认的测试前上下文清理逻辑,旧版Cookie保留API可直接恢复生效:
// cypress.config.js const { defineConfig } = require('cypress') module.exports = defineConfig({ e2e: { testIsolation: false, // 关闭用例间的上下文自动清理 // 其余配置项 } })
注意:关闭测试隔离后需自行处理用例间的状态污染,涉及状态重置的用例(如退出登录、切换身份)需手动补充上下文清理逻辑。
选型参考
- 无复杂全局清理逻辑、仅旧API写法不对导致失效:优先选方案1
- 存在动态域名/路径、多用户多表单独立Cookie场景:选方案2
- 测试套件无强状态隔离要求、追求最低配置成本:选方案3
内容的提问来源于stack exchange,提问作者jakub
相关产品推荐
相关产品推荐

