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

时间:2014-08-20 23:01:13

标签: selenium selenium-webdriver

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

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

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

Check for a stale element using selenium 2?

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

(另外,作为一方,如果我必须坚持投掷和捕捉异常,有什么比点击/发送键/悬停以抛出异常更好吗?我可能有一个我不喜欢的WebElement&#39 ; t想要执行任何这些操作,因为它可能会无意中影响其他内容。)

4 个答案:

答案 0 :(得分:22)

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);
      }
    };
}

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

答案 1 :(得分:10)

我知道这已经有了一个已接受的答案,而且我不知道你如何使用陈旧性检查的更大背景,但这可能对你或其他人有所帮助。您可以让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));

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

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

参考文献:ExpectedConditions

答案 2 :(得分:1)

C#的经典语句,用于检查Web元素的陈旧性

protected bool IsStale
{
    get { return ExpectedConditions.StalenessOf(webElement)(WebDriver); }
}

答案 3 :(得分:0)

我不完全明白你想做什么。你对'凌乱'的解决方案是什么意思?

也许你可以使用明确的等待条件stalenessOfnot结合使用。 但是每一个解决方案对我来说似乎都不稳定。

我所做的是,我在帮助类中有一个点击例程,这个想法就像:

public void ClickHelper(WebDriver driver, By by){
    int counter = 1;
    int max = 5;
    while (counter <= max) {
       try {
            WebElement clickableWebElement = driver.findElement(by);
            clickableWebElement.click();
            return;
            } catch (StaleElementReferenceException e) {
                System.out.print("\nTry " + counter + " with StaleElementReferenceException:\n" + e.getMessage() + "\n");
            }
       versuche++;
    }
    throw new RuntimeException("We tried " + max + " times, but there is still an Exception. Check Log!");
}

小心,我刚刚通过简化自己的方法进入了这个(有更多的检查,我个人使用xpath而不是等等)。可能会有一些错字错误,但我想你会明白基本的想法。由于我使用这个Helpermethode,我不必关心welelements的陈旧性。您可以更改最大值,但我个人认为,如果网站不稳定,元素过时,我会与开发人员交谈,因为这不是一个好的网站。