如何实现点击按钮后等待无预定义超时的表格行加载
解决方案
问题根源
你的代码里blnFound始终为false,核心原因是Cypress命令是异步执行的:同步的do..while循环会在cy.get().then()里的赋值代码运行前就完成多次迭代,循环判断!blnFound时,赋值操作根本还没执行,自然永远无法终止循环。
正确实现方式(递归重试)
用递归函数替代同步循环,完全适配Cypress的异步执行逻辑,同时实现超时控制:
// 初始化计时和最大超时阈值(45分钟) const startTime = new Date().getTime(); const MAX_TIMEOUT_MS = 45 * 60 * 1000; // 递归检查函数 const checkTableRows = () => { // 点击搜索按钮触发表格加载 cy.get(pageCommonID.btnSearch(), { timeout: Cypress.env('GLOBAL_TIMEOUT_ms'), log: true }) .scrollIntoView() .click({ force: true, multiple: true }); // 检查表格行数量 cy.get(pageWorkloadCaseID.tblResult()).find('tr').then((rows) => { if (rows.length !== 0) { // 找到有效行,终止递归 return; } // 计算已等待时长 const elapsedTime = new Date().getTime() - startTime; console.log('info', strID, `Case not found in Table. Elapsed Time: ${(elapsedTime / 1000 / 60).toFixed(2)} Min`); // 超时判断 if (elapsedTime >= MAX_TIMEOUT_MS) { throw new Error('Case not found in Table. Waiting Time exceeded 45Min'); } // 等待指定时长后重试 cy.wait(Cypress.env('BIT_GLOBAL_TIMEOUT_MEDIUM')); checkTableRows(); }); }; // 启动检查流程 checkTableRows();
优化点:仅单次点击搜索
如果搜索按钮点击一次后,后端会持续更新表格状态,不需要重复点击,可以把点击操作移到递归外部,只执行一次:
const startTime = new Date().getTime(); const MAX_TIMEOUT_MS = 45 * 60 * 1000; // 仅点击一次搜索按钮 cy.get(pageCommonID.btnSearch(), { timeout: Cypress.env('GLOBAL_TIMEOUT_ms'), log: true }) .scrollIntoView() .click({ force: true, multiple: true }); const checkTableRows = () => { cy.get(pageWorkloadCaseID.tblResult()).find('tr').then((rows) => { if (rows.length !== 0) return; const elapsedTime = new Date().getTime() - startTime; console.log('info', strID, `Case not found in Table. Elapsed Time: ${(elapsedTime / 1000 / 60).toFixed(2)} Min`); if (elapsedTime >= MAX_TIMEOUT_MS) { throw new Error('Case not found in Table. Waiting Time exceeded 45Min'); } cy.wait(Cypress.env('BIT_GLOBAL_TIMEOUT_MEDIUM')); checkTableRows(); }); }; checkTableRows();
内容的提问来源于stack exchange,提问作者RenDhark
相关产品推荐
相关产品推荐

