Cypress 9.5.4旧配置下如何在所有spec执行前运行指定代码/函数
Cypress 9.5.4 旧版配置实现所有spec执行前全局前置逻辑
针对你使用Cypress 9.5.4、采用旧版配置文件的场景,没有直接命名为onPrepare的钩子,但可以通过以下两种方案实现对应能力,根据你的逻辑运行环境选择即可:
方案1:Node环境全局前置(最接近onPrepare效果,全量spec仅执行1次)
如果你要跑的逻辑不需要操作浏览器/DOM,比如初始化测试环境、启动依赖服务、清理全局脏数据、生成全局测试凭证这类操作,直接用插件层的before:run事件即可,这是Cypress里最接近传统测试框架onPrepare能力的钩子:
- 打开旧版配置默认的插件入口文件
cypress/plugins/index.js - 在导出的函数中注册
before:run事件回调,你的前置逻辑直接写在回调里就行,异步逻辑可以直接用async/await,Cypress会等逻辑执行完成后才开始加载执行spec文件:
/// <reference types="cypress" /> module.exports = (on, config) => { on('before:run', async () => { // 这里写你的全局前置代码 console.log('全量测试启动前的全局初始化开始') // 示例:await startTestServer() / await cleanGlobalTestData() }) return config }
注意:这个钩子运行在Node.js上下文,无法访问浏览器DOM、不能调用cy.xxx系列的Cypress浏览器命令。cypress run模式下整个测试流程仅触发1次;cypress open模式下每次触发全量spec运行时会触发1次。
方案2:浏览器环境全局前置
如果你的前置逻辑必须在浏览器里执行,比如注入全局mock、登录获取存在浏览器存储里的会话信息,注意Cypress每个spec运行时都会重置浏览器上下文,浏览器层没有天然跨所有spec仅执行1次的钩子,可以通过support文件+执行标记实现:
- 打开旧版配置默认的支持文件入口
cypress/support/index.js(这个文件会在所有spec加载前自动引入,不需要你在每个spec里手动import) - 写入根级
before钩子,加执行标记避免同一次运行中重复执行:
let isGlobalInitFinished = false before(() => { if (isGlobalInitFinished) return // 这里写需要浏览器环境执行的全局前置逻辑 cy.log('浏览器端全局初始化执行') // 示例:cy.loginByApi() / cy.interceptGlobalMock() isGlobalInitFinished = true })
注意:如果是cypress open模式下手动选择单个spec运行,每个独立spec的浏览器上下文是隔离的,上面的标记会重置,逻辑会在每个spec首次运行时触发一次;如果需要跨spec也仅执行1次,可以把执行标记存在插件层的全局变量里,通过cy.task做状态判断即可。
避坑提示
- 不要把全局前置逻辑写在单个spec的
before/beforeEach钩子里,这类钩子仅对当前spec文件生效 - 如果全局逻辑是登录操作,建议搭配
cy.session缓存会话,减少重复登录的时间开销
内容的提问来源于stack exchange,提问作者Akbar
相关产品推荐
相关产品推荐

