如何在Cypress中等待指定数量的HTTP请求完成?
Cypress等待多个匹配请求的解决方案
你可以通过以下几种方式实现等待指定数量或所有匹配的myData请求完成:
1. 等待指定数量的请求
如果明确知道需要等待的请求数量,直接给cy.wait()传入包含对应数量别名的数组即可:
describe('Map Data', () => { beforeEach(()=> { cy.intercept('GET', 'http://someurl.com/myData/**').as('loadData') cy.visit('/') }) it('checks for all resources to be loaded', () => { cy.get('#loadButton').click() // 等待3个匹配的请求完成(可根据实际需求修改数字) cy.wait(Array(3).fill('@loadData')) }) })
这种方式会按顺序等待每个请求完成,Cypress会逐个处理数组里的别名,直到所有请求都得到响应。
2. 计数等待至少N个请求
如果需要确保至少有指定数量的请求被触发并完成,可以通过拦截器的回调计数,再断言计数达标:
describe('Map Data', () => { let requestCount = 0 beforeEach(()=> { cy.intercept('GET', 'http://someurl.com/myData/**', (req) => { req.continue(() => { // 每次请求完成后计数+1 requestCount++ }) }).as('loadData') cy.visit('/') requestCount = 0 // 每次测试前重置计数 }) it('checks for at least 3 resources to be loaded', () => { cy.get('#loadButton').click() // 等待计数至少达到3,超时时间可按需调整 cy.wrap(null).should(() => { expect(requestCount).to.be.at.least(3) }, { timeout: 15000 }) }) })
这种方式适合需要灵活校验请求数量的场景,比如不确定具体数量但知道最少需要多少个。
3. 等待所有请求完成(无新请求触发)
如果不知道具体请求数量,想等待所有请求都结束(一段时间内没有新请求),可以通过记录最后一次请求的时间来判断:
describe('Map Data', () => { let lastRequestTime beforeEach(()=> { cy.intercept('GET', 'http://someurl.com/myData/**', (req) => { req.continue(() => { // 更新最后一次请求的时间 lastRequestTime = Date.now() }) }).as('loadData') cy.visit('/') lastRequestTime = null }) it('checks for all resources to be loaded', () => { cy.get('#loadButton').click() // 等待至少1秒没有新请求,超时时间按需设置 cy.wrap(null).should(() => { expect(Date.now() - lastRequestTime).to.be.greaterThan(1000) }, { timeout: 20000 }) }) })
这种方式适合地图这类资源加载批次不确定的场景,确保后续不会再触发新的匹配请求。
内容的提问来源于stack exchange,提问作者user22303309
相关产品推荐
相关产品推荐

