首页 > 解决方案 > 如果 Selenium webdriver 中的页面上不存在元素,如何获取 false

问题描述

我正在使用自动化工作,一次又一次地遇到问题。一般来说,我的代码中有逻辑,我需要检查元素是否存在,下一步将取决于检查的结果。但是 Selenium 的基本工具仅返回布尔值 true,否则返回 NoSuchElementException。但我需要“假”。

和我之前的项目一样,我现在使用简单的包装器来解决这个问题:

private boolean isDisplayedOnPage(WebElementFacade wef){
    try{
        return wef.isDisplayed();
    } catch (NoSuchElementException nsee){
        return false;
    }
}

它工作得很好,但异常的使用让我感到困惑。另外,我读到了“等待”,但它也不会返回 false,只会让我忽略异常。Selenium 中是否有解决此问题的内置工具?或者也许有人可以提供一种更优雅的方法来解决它?

标签: seleniumselenium-webdriverautomationwebdriverqa

解决方案


原始 WebDriver API 的核心原则之一是期望用户知道被自动化页面的 DOM 状态。这意味着,在 API 的逻辑中,findElement使用不存在元素的定位器进行调用是一种异常情况,使得抛出异常完全合法。虽然有人可能会争辩说 API 行为中内置的期望是错误的,但这超出了这个答案的范围。如果您需要一个元素是否存在的布尔逻辑,您需要一个包装器方法,正如您已经发现的那样。在该包装方法中,您有两种选择:

  1. 使用findElement并抓住NoSuchElementException. 请注意, usingWebDriverWait为您隐式捕获此异常,语义等价物也是如此。

  2. 使用findElements(注意“s”),如果元素不存在,它将返回一个空列表而不会引发异常。


推荐阅读