检查WebElement是否过时而不处理异常

Jam*_*unn 21 selenium selenium-webdriver

我目前正在通过执行以下操作来检查WebElement是否过时:

public static boolean isStale(WebElement element) {
    try {
        element.click();
        return false;
    } catch (StaleElementReferenceException sere) {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

这与此问题提供的解决方案相同:

使用硒2检查陈旧元素?

但是,这对我来说似乎相当混乱.有没有更简洁的方法,我可以检查元素是否陈旧,而不必抛出并捕获异常?

(另外,作为一方,如果我必须坚持抛出并捕获异常,还有什么比单击/发送键/悬停以抛出异常更好吗?我可能有一个我不想做的WebElement任何这些行动,因为它可能无意中影响其他事情.)

Mar*_*lle 25

Webdriver本身也使用try/catch-construction来检查陈旧性.

来自org.openqa.selenium.support.ui.ExpectedConditions.java:

  public static ExpectedCondition<Boolean> stalenessOf(final WebElement element) {
    return new ExpectedCondition<Boolean>() {
      @Override
      public Boolean apply(WebDriver ignored) {
        try {
          // Calling any method forces a staleness check
          element.isEnabled();
          return false;
        } catch (StaleElementReferenceException expected) {
          return true;
        }
      }

      @Override
      public String toString() {
        return String.format("element (%s) to become stale", element);
      }
    };
}
Run Code Online (Sandbox Code Playgroud)

isEnabled()检查比使用单击操作更好 - 单击元素可能会导致不必要的副作用,您只想检查元素的状态.


Jef*_*ffC 11

我知道这已经有了一个已接受的答案,我不知道你如何使用陈旧性检查的更大背景,但也许这将有助于你或其他人.你可以ExpectedConditions.stalenessOf(WebElement)为你做的工作.例如,

WebElement pageElement = driver.findElement(By.id("someId"));
WebDriverWait wait = new WebDriverWait(webDriver, 10);
// do something that changes state of pageElement
wait.until(ExpectedConditions.stalenessOf(pageElement));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您不必执行pageElement.click()等操作来触发检查.

从文档中,.stalenessOf()等待元素不再附加到DOM.

参考文献:ExpectedConditions