使用Cypress的cy.intercept()时如何只获取最后一次拦截的API请求
Cypress拦截重复请求仅获取最后一次拦截结果的实现方案
方案1:固定触发2次场景,连续等待两次
如果确认该GET /ticket接口固定会触发两次,直接连续调用两次cy.wait()即可,第二次拿到的就是最后一次的拦截数据:
// 忽略第一次拦截结果 cy.wait('@assignedTicketAPI') // 第二次等待获取最后一次的请求、响应数据 cy.wait('@assignedTicketAPI').then(interception => { // interception包含完整的请求头、请求体、响应头、响应体等信息 console.log('最后一次返回的响应内容:', interception.response.body) })
方案2:不固定触发次数场景,取所有拦截记录的最后一项
Cypress 7.0及以上版本支持通过@别名.all获取所有匹配该拦截规则的拦截记录数组,直接取数组最后一位即可,不需要提前知道请求触发次数:
// 先确保所有接口请求都已经触发完成,可根据业务场景增加前置操作确保请求都已发出 cy.get('@assignedTicketAPI.all').then(interceptions => { // 取数组最后一项即为最后一次的拦截结果 const lastInterception = interceptions.at(-1) console.log('最后一次返回的响应内容:', lastInterception.response.body) })
注:低版本Cypress不支持.all语法,可使用下面的方案3实现
方案3:拦截时实时存储最新结果,随时可调用
如果需要在任意节点直接获取当前最新的拦截结果,可以在拦截回调中实时更新存储的最新值:
// 声明变量存储最新的拦截结果,也可以存入Cypress.env全局对象中 let latestAssignedTicket cy.intercept({ url: `${Cypress.config().apiUrl}/ticket`, method: 'GET', }, (req) => { req.continue((res) => { // 每次接口返回后更新为最新的结果 latestAssignedTicket = res.body }) }).as('assignedTicketAPI') // 后续任意需要使用结果的位置直接调用变量即可 cy.then(() => { console.log('最新的接口返回内容:', latestAssignedTicket) })
内容的提问来源于stack exchange,提问作者Haya D
相关产品推荐
相关产品推荐

