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

如何在Cypress.config.ts的before:run钩子中执行同步请求?

解决方案

方法1:使用async/await实现“同步式”异步请求(推荐)

Cypress的before:run钩子支持异步函数,只要返回Promise,Cypress就会等待操作完成后再启动测试会话。你可以通过async/await让axios请求的逻辑看起来像同步执行,同时保证请求在测试开始前完成:

import { defineConfig } from 'cypress';
import axios from 'axios';

// 替换为你的实际接口地址
const apiUrl = 'https://your-api-endpoint.com';

export default defineConfig({
  e2e: {
    setupNodeEvents(on): void {
      on('before:run', async () => {
        console.log('foo');
        try {
          // 用await等待请求完成,Cypress会阻塞到该操作结束
          const response = await axios.get(apiUrl);
          console.log('请求返回数据:', response.data);
        } catch (error) {
          console.error('请求出错:', (error as Error).message);
          // 若请求失败,可抛出错误终止测试会话
          throw error;
        }
      });
    }
  }
});

这种方式是Node.js处理异步操作的标准方案,底层仍是异步但逻辑上实现了“同步执行”的效果,完全适配Cypress的钩子机制,不会阻塞事件循环。

方法2:使用同步HTTP请求库(不推荐)

如果确实需要真正的同步HTTP请求(不推荐,同步操作会阻塞Node.js事件循环,影响性能),可以使用第三方库sync-request:

  1. 先安装依赖:
npm install sync-request --save-dev
  1. 在配置文件中使用:
import { defineConfig } from 'cypress';
import request from 'sync-request';

const apiUrl = 'https://your-api-endpoint.com';

export default defineConfig({
  e2e: {
    setupNodeEvents(on): void {
      on('before:run', () => {
        console.log('foo');
        try {
          // 同步发送请求,直到响应返回才继续执行
          const response = request('GET', apiUrl);
          const data = JSON.parse(response.getBody('utf8'));
          console.log('请求返回数据:', data);
        } catch (error) {
          console.error('请求出错:', (error as Error).message);
          throw error;
        }
      });
    }
  }
});

原有代码问题说明

你之前的performRequest函数没有返回Promise,也未使用await等待请求完成,导致Cypress的before:run钩子不会等待请求结束就直接启动测试。改用async/await后,钩子会等待Promise状态变更,确保请求操作在所有测试开始前执行完毕。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:25:17