Cypress如何拦截同URL的API请求并断言轮询最终返回200状态码
Cypress 轮询同URL断言最终返回200状态码方案
下面直接给两种可直接使用的实现方式:
方案1:递归等待单条请求
适合对轮询次数有明确预估的场景,可自定义重试次数和单请求超时时间:
// 1. 注册拦截器,捕获所有对目标URL的请求,替换为你实际的请求方法 cy.intercept('GET', 'http://example.com/search').as('searchPoll') // 2. 触发轮询的业务操作,比如点击搜索、提交表单等,替换为你实际的操作代码 cy.get('#submit-search').click() // 3. 递归等待轮询结果,10为最大重试次数,可根据实际场景调整 function waitForSuccess(retry = 10) { if (retry < 1) throw new Error('轮询超时,未收到200响应') cy.wait('@searchPoll', {timeout: 10000}).then((res) => { if (res.response.statusCode === 200) { expect(res.response.statusCode).to.eq(200) return } waitForSuccess(retry - 1) }) } waitForSuccess()
方案2:利用内置重试批量检查所有请求
写法更简洁,依赖Cypress命令自带的自动重试特性,无需手动写递归:
// 1. 注册拦截器,替换为你实际的请求方法 cy.intercept('GET', 'http://example.com/search').as('searchPoll') // 2. 触发轮询的业务操作 cy.get('#submit-search').click() // 3. 持续检查所有已捕获的请求,直到存在200响应或超时,30000为总超时时间(单位ms) cy.get('@searchPoll.all', {timeout: 30000}) .should((interceptList) => { const hasSuccessRes = interceptList.some(item => item.response?.statusCode === 200) expect(hasSuccessRes).to.be.true })
注意事项
- 两种方案里的请求方法、超时时间、触发轮询的操作都需要根据你的实际业务场景调整
- 如果需要同时验证200响应的返回内容,在
should的判断逻辑里追加对应断言即可
内容的提问来源于stack exchange,提问作者Amaros
相关产品推荐
相关产品推荐

