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

