Cypress中能否不调用cy.visit()直接使用cy.session()
问题根因
cy.session()的设计目标是缓存、复用登录态相关的Cookie、localStorage、sessionStorage等身份凭证数据,不会缓存测试操作产生的页面DOM状态、前端内存数据、临时交互状态。你遇到的第二个用例卡住问题本质是两个认知误区:
cy.session()执行完成后默认停留在框架内置的空白过渡页,不会自动跳转到业务页面- 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
相关产品推荐
相关产品推荐

