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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:42:49