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

Cypress使用cypress-localstorage-commands时localStorage未保存认证密钥问题

问题解决方案
  • 首先补全cypress-localstorage-commands的恢复逻辑
    你当前只配置了测试用例执行后保存localStorage的逻辑,缺少每个用例执行前恢复localStorage的步骤,每个it用例默认会重置运行上下文,需要在初始化代码中新增beforeEach钩子:
before(() => {
  cy.clearLocalStorageSnapshot();
});

// 新增恢复逻辑
beforeEach(() => {
  cy.restoreLocalStorage();
});

afterEach(() => {
  cy.saveLocalStorage();
});
  • 确认登录后认证密钥已写入LocalStorage再执行后续操作
    第一个用例登录完成后,新增断言确认密钥已存入LocalStorage,避免还没写入就提前保存快照,导致后续恢复的快照没有密钥,示例代码(将auth_key替换为你实际存储认证密钥的键名):
it('Open Simulations', () => {
  cy.visit('/') //加载首页
  cy.get('button[id="onetrust-accept-btn-handler"]').click() //接受Cookie
  cy.get('.input-box-main-field.required').type('mockuser') //输入用户名
  cy.get('input[type=password]').type('mockpwd{enter}') //输入密码
  cy.get('.spinner').should('not.exist') //等待加载 spinner 消失
  // 新增断言,确认认证密钥已写入LocalStorage
  cy.window().its('localStorage.auth_key').should('exist')
  cy.visit('/simulacion/nueva') //打开模拟功能页
  cy.scrollTo('right') //滚动到模拟出行按钮位置
  cy.get('.sc-EHOje.fgNeQB').eq(7).click() //点击模拟按钮
  cy.get('.spinner').should('not.exist') //等待加载 spinner 消失
})
  • 检查Cypress测试隔离配置
    如果你使用的是Cypress 10及以上版本,默认开启testIsolation配置,会在每个测试用例执行前清空所有LocalStorage、Cookie、会话信息,优先级高于第三方localStorage操作插件,需要在cypress.config.js中关闭该配置:
// cypress.config.js 配置示例
const { defineConfig } = require('cypress')

module.exports = defineConfig({
  e2e: {
    testIsolation: false,
    // 保留你的其他原有配置
  }
})
  • 拦截请求排查实际请求头信息
    可以拦截提交模拟数据的POST请求,打印请求头确认是否真的未携带认证密钥,方便定位是LocalStorage恢复问题还是应用前端未正确读取LocalStorage注入请求头的问题:
it('Fill Simulation', () => {
  // 替换为你实际的提交接口地址
  cy.intercept('POST', '/api/simulation/submit').as('submitSim')
  cy.get('.input-box-main-field').contains('Seleccione un destino de viaje').click()//打开下拉菜单
  cy.get('ul>li').eq(0).click()//选择第一个选项即西班牙
  cy.get('.input-box-main-field.required').type('2')//设置乘客数量
  cy.get('.input-box-main-field').eq(3).type(dayjs().format('DD/MM/YYYY'))//设置当日为返回日期
  cy.get('.main-button-text').contains('CONTINUAR').click()//点击继续
  // 等待请求返回,打印请求头到控制台
  cy.wait('@submitSim').its('request.headers').then(console.log)
  cy.get('.spinner').should('not.exist')
})
  • 备选优化方案:将登录逻辑放入全局before钩子
    如果不需要拆分登录和后续操作到不同用例,可以直接将登录逻辑放到before钩子中执行,不需要跨用例同步LocalStorage,减少上下文丢失概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:54:04