如何用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
相关产品推荐
相关产品推荐

