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

如何用Playwright在60秒内重复请求API直至返回指定对象?

用Playwright在60秒内重复请求API直到获取目标对象

你的现有代码不会主动发起请求——waitForResponse仅负责监听页面中已触发的网络请求的响应,它只会等待页面跳转、按钮点击等操作引发的符合条件的请求,不会主动重复调用API接口。

要实现「主动重复发起请求直到拿到目标对象」,可以参考以下方案:

实现思路

  • 设置总超时时间为60秒
  • 循环发起API请求,每次请求后校验响应内容是否符合要求
  • 符合要求则终止循环;超时则抛出错误
  • 每次请求失败或不符合条件时,添加短暂延迟避免频繁请求

示例代码

async function waitForTargetResponse(page, apiUrl, libraryName, timeout = 60000) {
  const startTime = Date.now();
  // 循环直到超时或拿到目标响应
  while (Date.now() - startTime < timeout) {
    try {
      // 根据API类型选择get/post等方法
      const response = await page.request.get(apiUrl);
      if (response.status() !== 200) {
        // 状态码不符合,短暂延迟后重试
        await page.waitForTimeout(1000);
        continue;
      }
      const respData = await response.json();
      // 检查是否存在目标对象
      const hasTargetLibrary = respData.libraries?.some(lib => lib.name === libraryName);
      if (hasTargetLibrary) {
        return respData; // 返回符合要求的响应数据
      }
    } catch (err) {
      // 捕获请求异常,避免单次失败终止流程
      console.error('请求出错:', err.message);
      await page.waitForTimeout(1000);
    }
    // 每次循环后添加延迟,降低请求频率
    await page.waitForTimeout(1000);
  }
  // 超时后抛出错误
  throw new Error(`60秒内未获取到包含${libraryName}的响应`);
}

// 使用示例
// const targetData = await waitForTargetResponse(this.page, "你的API地址", "目标library名称");

代码说明

  • page.request.get:Playwright提供的主动发起网络请求的方法,可根据API需求替换为post/put等
  • 超时控制:通过Date.now()计算已消耗时间,确保总耗时不超过60秒
  • 错误处理:捕获请求过程中的异常,保证流程不会因单次请求失败直接终止
  • 延迟重试:每次请求后添加1秒延迟,避免对API服务造成过大压力,延迟时长可按需调整

如果需要结合页面操作(比如先触发某个动作再等待响应),可以在循环中先执行页面操作再校验响应;若只是单纯主动轮询API,上述方案更直接高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:04:57