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

如何为递归Cypress请求函数添加Promise超时机制?

为Cypress递归查询函数添加超时限制

问题背景

我编写了递归函数resWait,通过Cypress的cy.req发送GET请求查询交易确认状态,若状态未为Confirmed,则等待3秒后重复调用该函数。希望为该函数设置2分钟的超时限制,一旦执行超时则进入后续测试流程,想通过Promise实现这一超时功能,但不清楚如何将Promise与现有函数整合,现有一个sleep的Promise示例,请求指导实现。

现有resWait函数:

function resWait() {
    cy.req(
      'GET',
      `${url}/transaction/acquirertrxquery?acquirerId=1&dateFrom=${actualDate}%2000:00:00&dateTo=${actualDate}%2023:59:00&externalId=${idExternal}`
    ).then((res) => {
      if (res.body.content[0].trxConfirmationStatus.description === 'Confirmed') {
        return
      }
      cy.wait(3000)
      resWait()
    })
}

现有sleep Promise示例:

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

解决方案

将递归查询逻辑封装为Promise,同时结合超时判断实现需求,避免与Cypress命令队列冲突:

function resWaitWithTimeout() {
  // 设定2分钟超时(120000毫秒)与3秒查询间隔
  const TIMEOUT = 120000;
  const CHECK_INTERVAL = 3000;

  // 封装递归查询为Promise
  const checkTransactionStatus = () => {
    return new Promise((resolve, reject) => {
      const startTime = Date.now();

      const recursiveCheck = () => {
        cy.req(
          'GET',
          `${url}/transaction/acquirertrxquery?acquirerId=1&dateFrom=${actualDate}%2000:00:00&dateTo=${actualDate}%2023:59:00&externalId=${idExternal}`
        ).then(res => {
          const status = res.body.content[0].trxConfirmationStatus.description;
          
          if (status === 'Confirmed') {
            resolve('交易已确认');
            return;
          }

          // 检查是否超时
          if (Date.now() - startTime >= TIMEOUT) {
            reject(new Error('交易确认查询超时'));
            return;
          }

          // 等待后继续递归查询
          sleep(CHECK_INTERVAL).then(recursiveCheck);
        }).catch(err => {
          // 请求失败时终止并抛出错误
          reject(new Error(`查询请求失败:${err.message}`));
        });
      };

      recursiveCheck();
    });
  };

  // 执行查询,超时或失败后不中断测试,直接进入后续流程
  checkTransactionStatus()
    .then(msg => cy.log(msg))
    .catch(err => {
      cy.log(err.message);
      // 此处可添加超时后的自定义处理逻辑
    });
}

// 保留原sleep函数
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

核心说明

  • Promise化递归逻辑:把循环查询的过程包装成Promise,便于用then/catch统一处理成功、超时及错误场景
  • 超时判断机制:记录查询起始时间,每次递归前校验已耗时,超过阈值则主动终止并触发超时逻辑
  • 替换cy.wait:使用原生sleepPromise替代Cypress的cy.wait,避免命令队列时序冲突,确保异步逻辑可控
  • 无中断测试流程:catch块仅记录日志不抛出错误,保证超时后测试能继续执行后续步骤

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 01:12:09