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

Cypress中能否不调用cy.visit()直接使用cy.session()

问题根因

cy.session()的设计目标是缓存、复用登录态相关的Cookie、localStorage、sessionStorage等身份凭证数据,不会缓存测试操作产生的页面DOM状态、前端内存数据、临时交互状态。你遇到的第二个用例卡住问题本质是两个认知误区:

  1. cy.session()执行完成后默认停留在框架内置的空白过渡页,不会自动跳转到业务页面
  2. Cypress每个it块默认是隔离的,前一个用例里选商品产生的临时状态,会在两个用例的间隙被框架清场,不会自动带到下一个用例,和cy.session()本身无关。
落地实现方案

1. 修正登录自定义命令逻辑

不要把页面访问逻辑写在cy.session()的初始化回调里,session只负责处理登录态缓存,缓存命中后必须主动触发页面跳转,解决卡在过渡页的问题。修正后的代码如下:

Cypress.Commands.add("openAndLogin", (targetRoute = '/') => {
    cy.session('defaultUserLogin', () => {
        // 仅在首次初始化登录态时执行登录流程
        cy.VisitHomePage()
        cy.get('#siteHeaderTopRight').find('button.signin-btn').should('contain.text', 'Sign In').click() 
        cy.userLogin()
    })
    // 登录态还原后,主动跳转到当前用例需要的目标页面
    cy.visit(targetRoute)
})

2. cy.session()的适用边界

多页面跳转、依赖前序业务结果的流程完全可以用cy.session(),但要明确它的能力边界:

  • 它只能帮你跳过重复的登录操作,不能帮你缓存选品、加购这类交互产生的业务状态
  • 如果你的商品对比列表是存在服务端、和登录账号绑定的,还原登录态后直接访问对应页面就能拉取到之前选好的商品数据
  • 如果对比列表是存在前端内存里的临时数据,不要指望前一个it块的操作残留带状态,要么把选品逻辑封装成可复用的前置命令在每个用例开头调用,要么通过接口拦截、mock数据的方式快速构造前置状态。

3. 用例拆分的最佳实践

不要为了省步骤把所有逻辑塞到同一个it块里,也不要靠用例的执行顺序传递状态,正确的做法是给每个it块配置独立可运行的最小前置:

  • 第一个用例(登录选品):调用cy.openAndLogin('/')进入首页,执行选品操作,断言选品状态正确
  • 第二个用例(进入对比页):调用cy.openAndLogin('/compare')直接进入对比页(如果选品状态是后端持久化的,直接做后续断言;如果是前端临时状态,先调用封装好的选品命令构造状态),断言对比页加载正确
  • 第三个用例(离页后返回):调用cy.openAndLogin('/compare')进入对比页,执行跳转到其他页面、再返回对比页的操作,断言返回后状态正确

每个it块里不仅可以调用cy.visit(),而且是必须调用。Cypress默认会在每个用例执行前重置页面DOM上下文,不主动调用visit就没有可操作的业务页面,自然会卡在session的空白过渡页。不要为了追求执行速度强行让多个用例共享页面上下文,这种用例单独运行第二个、第三个时必挂,稳定性极差。如果前置操作(比如选品)耗时过长,可以把对应操作封装成带缓存的自定义命令,配合接口存根的方式跳过重复操作,不要依赖用例顺序传递状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:36:18