Cypress在beforeEach内执行cy.request报错如何解决
Cypress 全局前置执行含cy.request操作的解决方案
报错的核心原因是你当前的
new Actor().perform(auth.uiLogin)代码写在JS文件的顶层作用域,当文件被导入时这段代码会立即执行,此时Cypress的测试运行上下文还未初始化,自然无法调用cy.request这类Cypress命令。
解决方案1:全局前置钩子(推荐,适配所有测试场景)
你可以直接将登录逻辑放到Cypress全局钩子配置文件中,所有测试场景运行前会自动执行,完全不需要修改现有100多条用例的代码:
- 打开Cypress支持目录下的
cypress/support/e2e.js(Cypress 10+版本,旧版本为cypress/support/index.js) - 写入以下代码:
import { Actor } from "cypress-screenplay"; import * as auth from "./ui/auth"; // 调整为你项目中auth文件的实际相对路径 // 全局beforeEach钩子,会在每个测试场景运行前自动执行 beforeEach(() => { new Actor().perform(auth.uiLogin); });
解决方案2:按需引入的前置钩子
如果只有部分测试套件需要登录,不需要全局生效,可以封装可复用的钩子模块:
- 新建
cypress/support/hooks/useLoginBeforeEach.js文件,写入:
import { Actor } from "cypress-screenplay"; import * as auth from "../ui/auth"; // 调整为实际路径 export const useLoginBeforeEach = () => { beforeEach(() => { new Actor().perform(auth.uiLogin); }); };
- 在需要登录的测试文件顶部引入并执行即可,无需修改每个测试场景:
import { useLoginBeforeEach } from '../../support/hooks/useLoginBeforeEach' // 执行后当前文件所有测试场景运行前都会自动登录 useLoginBeforeEach() // 你原来的测试代码 describe('测试套件', () => { it('测试场景1', () => { // 测试逻辑 }) })
注意事项
如果需要保证每次登录的状态干净,可以在执行登录前添加重置逻辑:
beforeEach(() => { cy.clearAllCookies() cy.clearLocalStorage() new Actor().perform(auth.uiLogin); })
内容的提问来源于stack exchange,提问作者ggonmar
相关产品推荐
相关产品推荐

