如何在Cypress中于所有测试执行前运行代码?实现全局单次登录
在Cypress中实现全局前置操作与单次登录
刚好在项目里频繁处理这类Cypress的全局配置需求,给你拆解清楚两个问题的解决方案:
一、在所有测试套件执行前运行代码
Cypress专门提供了全局初始化的入口文件——cypress/support/e2e.js(如果是Cypress 9及更早版本,对应文件是cypress/support/index.js)。
- 这个文件里的代码会在所有测试文件加载、所有测试用例执行之前自动运行,非常适合放全局通用的初始化逻辑,比如设置默认视口、注册自定义命令、配置全局断言等。
- 如果要实现“整个测试运行期间只执行一次”的前置逻辑,直接在这个文件里用
before()钩子就行:// cypress/support/e2e.js before(() => { // 这段代码只会在所有测试开始前执行一次 cy.log("全局初始化:设置默认视口"); cy.viewport(1920, 1080); // 还可以在这里做其他全局准备,比如清除测试数据 });
二、实现全局单次登录(避免每个文件重复登录)
关于单次登录,不建议在每个测试文件里单独写before()调用登录——那样每个文件都会重复登录,既浪费时间又不符合你的需求。这里有两种更优的方案:
方案1:全局before()钩子(简单直接)
直接在cypress/support/e2e.js的before()里调用登录逻辑,整个测试套件运行期间只会登录一次:
// cypress/support/e2e.js before(() => { // 假设你已经注册了自定义的login命令(可以在commands.js里定义) cy.login("your-account", "your-password"); });
注意:这种方式适合测试场景单一、不需要切换登录状态的情况。如果有测试需要退出登录或切换账号,可能会相互影响。
方案2:Cypress Session API(推荐,更稳定)
从Cypress 12开始,官方推出了cy.session() API,专门用来管理会话状态,不仅能实现单次登录,还能自动处理会话过期、跨测试文件共享会话的问题,稳定性拉满。
步骤如下:
- 先在
cypress/support/e2e.js里配置会话跨文件共享:// cypress/support/e2e.js Cypress.session.defaults({ cacheAcrossSpecs: true, // 开启后会话可在不同测试文件间复用 }); - 在
cypress/support/commands.js里定义带会话管理的登录命令:// cypress/support/commands.js Cypress.Commands.add("login", (username, password) => { cy.session([username, password], () => { // 这里写实际的登录流程 cy.visit("/login"); cy.get("#username-input").type(username); cy.get("#password-input").type(password); cy.get("#login-btn").click(); // 验证登录成功,确保会话有效 cy.url().should("include", "/home"); }); }); - 最后在全局或测试文件中调用登录命令:
你可以在e2e.js的before()里调用一次,或者在需要登录的测试文件的before()里调用——因为开启了cacheAcrossSpecs,不管多少个文件调用,实际只会执行一次登录:// cypress/e2e/home-page.spec.js before(() => { cy.login("your-account", "your-password"); // 只会执行一次,其他文件调用也不会重复登录 });
这样既满足了“所有测试前仅登录一次”的需求,又能应对会话过期等异常情况,比单纯的全局before()更可靠。
内容的提问来源于stack exchange,提问作者Florian F
相关产品推荐
相关产品推荐

