selenium - 如果 Selenium webdriver 中的页面上不存在元素,如何获取 false
问题描述
我正在使用自动化工作,一次又一次地遇到问题。一般来说,我的代码中有逻辑,我需要检查元素是否存在,下一步将取决于检查的结果。但是 Selenium 的基本工具仅返回布尔值 true,否则返回 NoSuchElementException。但我需要“假”。
和我之前的项目一样,我现在使用简单的包装器来解决这个问题:
private boolean isDisplayedOnPage(WebElementFacade wef){
try{
return wef.isDisplayed();
} catch (NoSuchElementException nsee){
return false;
}
}
它工作得很好,但异常的使用让我感到困惑。另外,我读到了“等待”,但它也不会返回 false,只会让我忽略异常。Selenium 中是否有解决此问题的内置工具?或者也许有人可以提供一种更优雅的方法来解决它?
解决方案
原始 WebDriver API 的核心原则之一是期望用户知道被自动化页面的 DOM 状态。这意味着,在 API 的逻辑中,findElement
使用不存在元素的定位器进行调用是一种异常情况,使得抛出异常完全合法。虽然有人可能会争辩说 API 行为中内置的期望是错误的,但这超出了这个答案的范围。如果您需要一个元素是否存在的布尔逻辑,您需要一个包装器方法,正如您已经发现的那样。在该包装方法中,您有两种选择:
使用
findElement
并抓住NoSuchElementException
. 请注意, usingWebDriverWait
为您隐式捕获此异常,语义等价物也是如此。使用
findElements
(注意“s”),如果元素不存在,它将返回一个空列表而不会引发异常。
推荐阅读
- javascript - 表单数据未正确发布
- java - 无法保存 Spring JPA 与数据库的多对多关系:无法通过反射设置字段值:[...] 根本原因是 java.lang.NullPointerException
- image-processing - 如何修复训练和验证准确性的波动?
- c# - 过渡状态 VS 开关案例什么是应用状态机的最佳方法 [C#]
- sql - 子查询返回超过 1 个值:正在执行 UDF
- javascript - 如何在 Vuex 模块(vueJs)中过滤命名空间的 getter
- algorithm - 将一个数组划分为K个子数组/组时,最大化所有子数组中的最小子数组和
- python - ValueError: int() 以 10 为基数的无效文字:'
' - c# - 逆列表二级键索引实现?
- r - r 标签变量组合