Cypress中如何重复发起请求直到获取状态为finished的响应
你写的代码卡住的核心原因是 Cypress 命令的执行逻辑和同步while循环不兼容:Cypress 的cy.wait、cy.getInfo等命令不会立刻执行,而是先加入异步命令队列,等同步代码全部执行完再按顺序执行。你写的while循环是同步逻辑,在循环判断时then回调里修改i的逻辑还没有运行,i会一直保持初始值0,导致循环逻辑完全失效。
以下是两种可行的解决方案,完全不需要静态硬等,也不会出现执行卡住的问题:
方案1:利用Cypress内置重试能力(最简单)
只要你的cy.getInfo()自定义命令返回的是Cypress链式对象(比如内部是基于cy.request封装),直接借助Cypress断言的自动重试机制即可实现需求:
it('name of the test', function() { cy.processFile() // timeout参数设置最大等待时长,这里设为5秒,可按需调整 cy.getInfo({ timeout: 5000 }) .its('body.status') .should('eq', 'finished') // 断言通过后自动执行后续逻辑 expect(.....) })
Cypress会自动轮询发起getInfo请求,直到状态变为finished或者超出最大等待时长,既不会浪费多余等待时间,也不会出现状态没返回就提前执行的不稳定问题。
方案2:递归实现自定义重试逻辑(适合需要精细控制间隔、重试次数的场景)
如果你需要严格控制每次重试的间隔、最大重试次数,可以用递归函数替代同步循环:
it('name of the test', function() { cy.processFile().then(() => { // 自定义重试函数,默认从第0次开始重试 function waitForFinish(retryCount = 0) { // 超过最大重试次数直接抛出异常 if (retryCount >= 5) { throw new Error('等待状态变为finished超时') } cy.wait(1000) cy.getInfo().then((resp) => { if (resp.body.status !== 'finished') { // 状态未满足,递归调用重试,次数+1 waitForFinish(retryCount + 1) } else { // 状态满足后执行后续断言逻辑 expect(.....) } }) } // 首次调用重试函数 waitForFinish() }) })
递归逻辑会等上一次请求结果返回后再判断是否需要发起下一次请求,完全适配Cypress的异步执行机制,不会出现命令提前入队的问题。
内容的提问来源于stack exchange,提问作者Vicko
相关产品推荐
相关产品推荐

