如何以及何时实现Selenium WebDriver的刷新(ExpectedCondition <t>条件)?</t>

时间:2015-01-19 14:25:31

标签: java selenium selenium-webdriver

我正在浏览ExpectedCondtions类的方法并找到一种方法:refreshed

我可以理解,当你获得StaleElementReferenceException并希望再次检索该元素时,可以使用该方法,这样可以避免StaleElementReferenceException

我的上述理解可能不正确,因此我想确认一下:

  1. 何时应使用refreshed
  2. 以下代码something部分的代码应该是什么:
  3. wait.until(ExpectedConditions.refreshed(**something**));

    有人可以用一个例子解释一下吗?

2 个答案:

答案 0 :(得分:8)

根据消息来源:

  

条件的包装器,允许通过重绘来更新元素。   这解决了条件问题,它有两个部分:找到一个   元素,然后检查它的一些条件。对于这些条件,它是   可能是元素所在,然后重新绘制   客户端。发生这种情况时,{@link StaleElementReferenceException}是   检查条件的第二部分时抛出。

基本上,这是一个等待对象完成DOM操作的方法。

通常,当您执行driver.findElement该对象表示对象的内容时。

当DOM操作时,并在单击按钮后说,向该元素添加一个类。如果您尝试对所述元素执行操作,它将抛出StaleElementReferenceException,因为现在返回的WebElement不代表更新的元素。

当您期望进行DOM操作时,您将使用refreshed,并且您希望等到它在DOM中被操作完成。

实施例

<body>
  <button id="myBtn" class="" onmouseover="this.class = \"hovered\";" />
</body>

// pseudo-code
1. WebElement button = driver.findElement(By.id("myBtn")); // right now, if you read the Class, it will return ""
2. button.hoverOver(); // now the class will be "hovered"
3. wait.until(ExpectedConditions.refreshed(button));
4. button = driver.findElement(By.id("myBtn")); // by this point, the DOM manipulation should have finished since we used refreshed.
5. button.getClass();  // will now == "hovered"

请注意,如果您在第3行执行button.click(),则会抛出StaleReferenceException,因为此时已经操作了DOM。

在我使用Selenium的这些年里,我从来没有使用过这种情况,所以我认为这是一种“边缘情况”的情况,你很可能甚至不用担心使用它。希望这有帮助!

答案 1 :(得分:2)

在尝试访问新刷新的搜索结果时,refreshed方法对我非常有帮助。仅ExpectedConditions.elementToBeClickable(...)尝试等待搜索结果会返回StaleElementReferenceException。要解决这个问题,这是一个帮助方法,它会等待并重试最多30秒,以便刷新和单击搜索元素。

public WebElement waitForElementToBeRefreshedAndClickable(WebDriver driver, By by) {
    return new WebDriverWait(driver, 30)
            .until(ExpectedConditions.refreshed(
                    ExpectedConditions.elementToBeClickable(by)));
}

然后在搜索后单击结果:

waitForElementToBeRefreshedAndClickable(driver, By.cssSelector("css_selector_to_search_result_link")).click();

希望这对其他人有帮助。