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

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:按需引入的前置钩子

如果只有部分测试套件需要登录,不需要全局生效,可以封装可复用的钩子模块:

  1. 新建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);
  });
};
  1. 在需要登录的测试文件顶部引入并执行即可,无需修改每个测试场景:
import { useLoginBeforeEach } from '../../support/hooks/useLoginBeforeEach'
// 执行后当前文件所有测试场景运行前都会自动登录
useLoginBeforeEach()

// 你原来的测试代码
describe('测试套件', () => {
  it('测试场景1', () => {
    // 测试逻辑
  })
})

注意事项

如果需要保证每次登录的状态干净,可以在执行登录前添加重置逻辑:

beforeEach(() => {
  cy.clearAllCookies()
  cy.clearLocalStorage()
  new Actor().perform(auth.uiLogin);
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:09:03