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

Cypress会话在it块间丢失跳转空白页,如何持久化会话?

Cypress跨it块持久化会话解决方法

你的问题核心是没正确使用cy.session的复用逻辑,当前代码把登录会话放在单独的it块中,而Cypress每个it块执行后会自动重置页面状态(跳转到空白页),且后续it块不会自动复用之前的会话。以下是正确的处理方式:

修正方案:用beforeEach统一管理会话

把cy.session放在beforeEach钩子中,确保每个it块执行前都会确认会话有效性,自动复用登录状态,同时恢复应用页面:

describe('create cycle', () =>{
  beforeEach(() => {
    // 缓存/复用登录会话
    cy.session('login', () => {
      cy.visit('/')
      login(); // 你的登录函数
      // 务必添加登录成功的断言,确保会话缓存有效
      cy.url().should('include', '/dashboard') 
    })
    // 每个it块开始前回到应用页面,避免空白页
    cy.visit('/') 
  })

  it('start cycle', ()=>{  
    cy.get("#cycles-library > ul > #library-item-2").click();
    cy.get("#create-cycle").click()
    cy.get("#startDate > label").first().click()
    cy.get("#duration > label").first().click()
    cy.get('#groups-input').click()
    cy.get("body>div").last().contains('group 2').click()
    cy.get("button#create-cycle").click()
  })

  // 后续的it块都会自动复用会话,无需重复登录
  it('another test', () => {
    // 直接操作页面,已处于登录状态
    cy.get('#some-element').click()
  })
})

关键说明

  • cy.session的作用是缓存登录后的会话数据(Cookie、LocalStorage等),第一次执行时会运行登录逻辑,后续会直接复用缓存,跳过登录步骤。
  • 每个it块执行完后,Cypress会重置页面到about:blank,所以必须在beforeEach里加上cy.visit('/'),确保进入应用页面。
  • 登录函数里一定要加登录成功的断言(比如检查URL跳转、用户头像存在等),这样cy.session才能正确判断会话是否有效,避免缓存失败的登录状态。

进阶:会话有效性验证(可选)

如果需要更严格的会话验证,可以给cy.session添加validate选项,每次复用会话前检查会话是否有效:

cy.session('login', () => {
  cy.visit('/')
  login();
  cy.url().should('include', '/dashboard')
}, {
  validate() {
    // 验证LocalStorage中是否存在用户token,确保会话有效
    cy.window().its('localStorage.userToken').should('exist')
  }
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:40:41