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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 00:57:28