Protractor中无需try/catch处理Expected Conditions未满足场景
Protractor 结合 async/await 的可选元素处理实现
场景描述
基于 Protractor 配合 async/await 模式开展 Web 自动化测试时,常见这类分支逻辑:
- 点击指定功能开关后,仅首次触发时会弹出一个额外交互元素
- 元素出现时需要执行点击操作,未出现则直接执行后续流程
- 实现逻辑不依赖 try/catch 块、Promise reject 这类异常处理分支
现有代码形态
预期的理想写法
// 点击可能触发额外元素弹出的开关 await this.toggle.click() // 等待2秒判断额外元素是否存在 const isExtraElementPresent = await browser.wait(ExpectedConditions.presenceOf(extraElement), 2000); if (isExtraElementPresent) { await extraElement.click(); }
当前依赖异常捕获的实现
await this.toggle.click(); try { await this.extraElement.click(); } catch (error) { console.log("Extra element didn't appear."); }
无异常依赖的可实现方案
需要明确:默认 browser.wait 方法在等待超时、预设条件未满足时,会触发 Promise reject 抛出超时异常,直接使用上述理想写法会导致整个测试流程中断。要实现无异常判断,核心思路是把元素存在性的判断从“异常触发场景”转换为可直接返回的布尔值,全程不触发异常抛出。
自封装通用轮询判断工具
写一个无异常的等待判断函数,通过轮询查询元素状态,超时即返回布尔值,全程无 try/catch、无 Promise reject 逻辑:
/** * 等待指定元素出现,超时返回布尔值,全程不抛出异常 * @param element 待判断的页面对象 * @param timeout 最长等待时长,单位ms * @param interval 轮询查询间隔,单位ms */ async function waitElementPresenceSilently( element: ElementFinder, timeout = 2000, interval = 200 ): Promise<boolean> { const startTime = Date.now(); while (Date.now() - startTime < timeout) { const isElementPresent = await element.isPresent(); if (isElementPresent) { return true; } await browser.sleep(interval); } return false; }
实际业务中的使用方式完全匹配预期逻辑:
await this.toggle.click(); const isExtraElementPresent = await waitElementPresenceSilently(extraElement, 2000); if (isExtraElementPresent) { await extraElement.click(); } else { console.log("Extra element didn't appear."); }
实现说明
- 整个判断流程通过正常的业务返回值走分支,没有任何异常捕获逻辑
- 轮询逻辑和 Protractor 内置的
browser.wait实现原理一致,等待效果无差异 - 可以直接把这个工具复用在所有“可选元素判断”的场景中,不需要重复写异常捕获代码
内容的提问来源于stack exchange,提问作者Amrou
相关产品推荐
相关产品推荐

