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

不使用cy.session()时如何在Cypress全测试用例中保存指定Cookie

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:57:21