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

