Cypress中cy.session()保存的会话Cookie无法在it块复用的技术求助
解决Cypress中cy.session()会话复用失效的问题
看起来你遇到的核心问题是会话没有正确保存,导致每次it块执行时都重新进入登录流程。我帮你分析下代码里的问题,再给出修复方案:
1. 首先修正登录函数里的致命错误
你在输入密码的时候不小心用了username变量,而不是password,这会直接导致登录失败——Cypress自然无法保存有效的登录会话:
// 错误代码: cy.get('#txtPassword').type(username) // 应该改为: cy.get('#txtPassword').type(password)
这个错误会让你每次登录都失败,会话保存的是未登录状态的Cookie,所以后续访问dashboard时会被重定向到登录页。
2. 给cy.session添加会话验证逻辑
为了确保Cypress能正确识别会话是否有效,建议给cy.session添加登录成功的验证步骤,或者配置validate回调。这样Cypress会在复用会话前检查是否仍处于登录状态,避免不必要的重复登录:
const loginPage = (username, password) => { cy.session([username, password], () => { cy.visit('/') cy.get('#txtUsername').type(username) cy.get('#txtPassword').type(password) // 修复密码输入错误 cy.get('#btnLogin').click() // 验证登录成功,确保会话保存的是已登录状态 cy.url().should('include', '/dashboard') cy.get('#welcome').should('be.visible') }, { // 可选:添加验证函数,检查会话是否仍有效 validate: () => { cy.get('#welcome', { timeout: 1000 }).should('be.visible') } }) }
3. 调整it块里的页面访问逻辑
当会话成功保存后,你不需要在it块里手动重复访问/index.php/dashboard——cy.session会自动恢复会话状态(包括Cookie、localStorage等)。如果需要确认页面位置,可以在beforeEach里统一处理页面跳转,后续it块直接操作元素即可。
修改后的完整测试代码:
import testdata from '../../fixtures/testdata.json' describe('Example to demonstrate the use `each` in Cypress', function () { const loginPage = (username, password) => { cy.session([username, password], () => { cy.visit('/') // baseUrl: "https://opensource-demo.orangehrmlive.com/" cy.get('#txtUsername').type(username) cy.get('#txtPassword').type(password) // 修复密码输入错误 cy.get('#btnLogin').click() // 验证登录成功,确保会话有效 cy.url().should('include', '/dashboard') cy.get('#welcome').should('be.visible') }, { // 可选:验证会话是否仍有效,避免重复登录 validate: () => { cy.get('#welcome').should('be.visible') } }) } beforeEach('Loading test data and establishing session', function () { loginPage(testdata.username, testdata.password) // 会话恢复后,统一跳转到目标页面 cy.visit('/index.php/dashboard') }) it('Validating the Quick Launch menu', function () { cy.get('.quickLaungeContainer').each(function($el, index) { expect($el).to.contain(this.testdata.quickLaunch[index]) // 注意:如果用箭头函数会丢失this绑定,这里改用普通函数访问testdata }) }) })
额外注意事项
- 确保你的Cypress版本在9.0及以上,因为
cy.session是从这个版本开始正式引入的。 - 检查
testdata.json里的账号是否正确(OrangeHRM演示站的默认账号是Admin和admin123)。 - 如果问题仍存在,可以打开Cypress开发者工具,查看Application标签下的Cookie是否正确保存,以及页面跳转时的网络请求状态码(比如是否有302重定向到登录页)。
内容的提问来源于stack exchange,提问作者Mr.Prasad J
相关产品推荐
相关产品推荐

