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

如何在Cypress中为cy.request添加延迟重试及重试次数限制

Cypress Elastic 请求重试方案

针对你需要向Elastic服务器发送请求、无记录时10秒重试、最多等待2分钟的需求,以下是符合Cypress异步命令逻辑的解决方案,可避免“mixing async with sync”错误:

1. 定义自定义重试命令

在cypress/support/commands.js中添加自定义命令,封装重试逻辑:

Cypress.Commands.add('requestWithRetry', (options, retryInterval = 10000, maxDuration = 120000) => {
  const startTime = Date.now();

  const attemptRequest = () => {
    return cy.request(options).then((response) => {
      // 检查Elastic返回的结果集是否有数据
      if (response.body.hits.hits.length > 0) {
        return response; // 有数据则直接返回响应
      }

      // 判断是否已达到最大等待时长
      if (Date.now() - startTime >= maxDuration) {
        return response; // 超时后返回当前空响应
      }

      // 等待指定间隔后递归重试
      cy.wait(retryInterval);
      return attemptRequest();
    });
  };

  return attemptRequest();
});

2. 在测试用例中使用

调用自定义命令,传入Elastic请求配置即可:

it('获取Elastic数据并自动重试', () => {
  const requestOptions = {
    auth: { username: 'your-username', password: 'your-password' },
    method: 'POST',
    url: 'https://your-elastic-instance/_search',
    body: {
      // 你的Elastic查询DSL
      query: { match_all: {} }
    }
  };

  cy.requestWithRetry(requestOptions).then((response) => {
    if (response.body.hits.hits.length) {
      // 处理有数据的场景
      cy.log('成功获取到Elastic记录');
      expect(response.body.hits.total.value).to.be.greaterThan(0);
    } else {
      // 超时仍无数据的场景处理
      cy.log('2分钟内未获取到任何记录');
    }
  });
});

方案说明

  • 采用递归调用方式适配Cypress异步命令链,彻底避免同步/异步代码混合的错误。
  • 通过时间戳判断总等待时长,确保不会超过2分钟限制,比固定重试次数更精准(考虑请求本身的耗时)。
  • 可灵活调整重试间隔和最大等待时长,只需在调用时传入额外参数,例如cy.requestWithRetry(options, 5000, 60000)表示间隔5秒重试、最多等待1分钟。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 07:07:01