Cypress调用分页API查找文件时如何从回调中跳出外层循环
解决方案
你原本代码的核心问题是:
Cypress 的命令是异步入队执行的,你写的同步
for循环会在所有接口请求触发前就执行完毕,因此在内层then回调里的break完全无法影响到已经跑完的外层循环,甚至会出现你还没查到第一页结果,所有7页的请求都已经被塞进执行队列的情况。
你可以用递归替代同步for循环,主动控制是否发起下一页的请求,只要找到目标文件就终止递归,自然实现跳出两层循环的需求,完整可运行代码如下:
describe('Check particular value', function() { it('Check record', () => { // 配置项:最大查询页数、目标文件名、接口公共参数 const MAX_PAGE = 6; const TARGET_FILE_NAME = 'file_2021_08_20_04_31.txt'; const BASE_REQUEST_OPTIONS = { method: "GET", url: "https://mydomainName.com/api/v1/searchFile/getFileList", qs: { pageSize: 15 }, headers: { "authorization": "jwt token " } }; // 递归查询函数 function searchFileByPage(currentPage) { // 超过最大查询页还没找到,直接断言失败 if (currentPage > MAX_PAGE) { throw new Error(`所有页面遍历完成,未找到目标文件${TARGET_FILE_NAME}`); } // 发起当前页请求 cy.request({ ...BASE_REQUEST_OPTIONS, qs: { ...BASE_REQUEST_OPTIONS.qs, pageNo: currentPage } }).then(response => { const fileList = response.body.data; // 遍历当前页文件 for (let j = 0; j < fileList.length; j++) { if (fileList[j].fileName.includes(TARGET_FILE_NAME)) { // 找到目标文件,直接执行断言逻辑,return后不会触发下一页递归 cy.log(`目标文件在第${currentPage}页第${j+1}条找到`); expect(fileList[j].fileName).to.include(TARGET_FILE_NAME); return; } } // 当前页没找到,递归查询下一页 searchFileByPage(currentPage + 1); }); } // 从第1页开始查询 searchFileByPage(1); }); });
这种写法完全符合Cypress的异步执行逻辑,只要找到目标文件就会立刻停止后续的分页请求,不会产生无效的接口调用。
内容的提问来源于stack exchange,提问作者Suresh Sharma
相关产品推荐
相关产品推荐

