Cypress测试SAP Hybris时元素未找到无法翻页的问题排查
解决Cypress测试Hybris时未找到元素不触发翻页的问题
你的核心问题在于cy.contains()是Cypress的断言式命令,它默认会等待并断言目标元素存在。当当前页面找不到目标文本时,它会直接超时抛出错误,根本不会进入后续的.then()分支执行翻页逻辑——这就是第二页产品无法触发翻页的原因。
以下是修复后的代码及关键说明:
const checkProductOnPage = (CATALOG_LABEL, retries = 0) => { const maxRetries = 5; // 根据预期最大页数调整 // 先获取当前页面所有匹配选择器的元素,而非直接断言存在 return cy.get('span.yw-coll-browser-hyperlink', { timeout: 10000 }) .then($elements => { // 筛选出包含目标文本的元素 const $target = $elements.filter(`:contains("${CATALOG_LABEL}")`); if ($target.length > 0) { // 找到目标元素,执行后续操作 return cy.wrap($target) .scrollIntoView() .should('be.visible') .click({ force: true }); } else if (retries < maxRetries) { // 检查下一页按钮是否可用(排除禁用状态) return cy.get('.z-paging-icon.z-icon-angle-right') .eq(0) .then($nextBtn => { if (!$nextBtn.hasClass('z-paging-disabled')) { // 点击翻页,等待页面内容更新(替换固定等待,更可靠) return cy.wrap($nextBtn) .click({ force: true }) .wait(() => { // 等待新页面的产品列表加载完成 return Cypress.$('span.yw-coll-browser-hyperlink').length > 0; }) .then(() => checkProductOnPage(CATALOG_LABEL, retries + 1)); } else { throw new Error('Reached the last page and product not found'); } }); } else { throw new Error('Product not found after maximum retries'); } }) // 处理页面初始无产品元素的异常情况 .catch(err => { if (retries < maxRetries) { return checkProductOnPage(CATALOG_LABEL, retries + 1); } throw err; }); };
关键修改点:
- 替换断言式查找为主动筛选:用
cy.get()获取所有匹配元素后再筛选目标文本,避免直接断言失败中断流程,确保找不到元素时能进入翻页逻辑。 - 增加翻页按钮状态校验:判断按钮是否处于禁用状态,避免点击无效按钮导致无意义重试。
- 优化页面等待逻辑:用条件等待替代固定时长的
wait(5000),确保页面实际加载完成后再执行下一次查找,适配不同加载速度。 - 异常兜底处理:捕获页面初始无产品元素的情况,避免直接报错退出。
内容的提问来源于stack exchange,提问作者No Tools No Craft
相关产品推荐
相关产品推荐

