如果 Selenium webdriver 中的页面上不存在元素,如何获取 false

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

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

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

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

stack overflow How to get false if element is not present on page in Selenium webdriver
原文答案
author avatar

接受的答案

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

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

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


答案:

作者头像
Boolean bool = my_driver.findElements(By.id("my element id")).size()>0;

这会帮助你。

作者头像

一个不干净的解决方法可能是检查 DOM 是否有一个唯一的字符串来象征您的 WebElement,然后如果可以找到它,则将其写入布尔值。

此循环将每秒检查 DOM 中的字符串 60 次,如果没有找到则刷新页面:

for (int i= 0; i <60; i++){
  String pageSource = browser.getPageSource().toString();
  boolean elementThere = pageSource.contains("uniqueStringOfElement");
if (elementThere){
  browser.WebElement.click()
  break;
 } 
else {
  Thread.sleep(1000); 
  browser.navigate().refresh();
 }
}