Cypress升级后能否在before钩子打开页面供后续测试复用?
升级Cypress到12.6.0后保留会话与页面状态的方案
cy.session()是官方推荐的正确方案,用来在测试间共享登录会话,同时可以通过一些技巧实现测试间的页面状态延续。以下是具体实现和说明:
核心原理
Cypress 10+默认开启测试隔离,每个测试用例结束后会清除页面DOM、重置上下文,这是为了保证测试独立性。但cy.session()可以缓存登录会话(包括cookie、localStorage、NTLM认证状态等),避免重复执行登录流程;若需要延续页面操作状态,可通过保存URL在后续测试中恢复页面位置。
代码改造步骤
1. 确认测试隔离配置(默认无需修改)
在cypress.config.js中,测试隔离默认开启,无需额外配置:
module.exports = defineConfig({ e2e: { testIsolation: true, // 默认值,保持开启即可 }, });
2. 用cy.session()封装登录逻辑
将原before()中的NTLM登录和初始访问逻辑移入cy.session(),确保会话只创建一次,后续测试复用:
beforeEach(() => { cy.session('ntlm-authenticated-session', () => { // 仅在会话不存在时执行登录流程 cy.ntlm( ['<url>'], '<username>', '<password>' ); cy.visit('<url>'); // 添加断言验证登录成功,确保会话有效 cy.contains('欢迎, <username>').should('be.visible'); }); // 每个测试前恢复会话后,重新访问页面(测试隔离会清除DOM,需重新加载) cy.visit('<url>'); });
3. 实现测试间的页面状态延续
如果需要在Test2中继续Test1操作后的页面,可通过保存URL的方式恢复:
it('Test 1', () => { cy.contains('something').click(); // 保存当前操作后的URL cy.url().as('postTest1Url'); }); it('Test 2', () => { // 加载Test1结束后的页面,延续操作 cy.get('@postTest1Url').then(targetUrl => { cy.visit(targetUrl); }); cy.get('#something').type('{enter}'); });
关键说明
- 会话复用:
cy.session()会自动缓存会话状态,后续测试无需重复执行NTLM登录,大幅提升测试速度。 - 页面DOM限制:由于测试隔离机制,Cypress不会保留测试间的DOM状态,因此必须通过
cy.visit()重新加载页面,但会话已验证,加载后会直接处于登录状态。 - 测试独立性权衡:这种方式会让Test2依赖Test1的执行结果,若Test1失败,Test2也会受影响。如果业务场景允许,建议尽量保持测试独立;若必须连续操作,此方案是可行的折中方案。
内容的提问来源于stack exchange,提问作者Petar
相关产品推荐
相关产品推荐

