如何以及何时实现Selenium WebDriver的刷新(预期条件<T>条件)?

2022-09-03 13:54:38

我正在浏览类的方法,发现一种方法:刷新ExpectedCondtions

我可以理解,当你得到并且你想再次检索该元素时,可以使用该方法,并且这样可以避免StaleElementReferenceExceptionStaleElementReferenceException

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

  1. 何时应使用?refreshed
  2. 以下代码的一部分的代码应该是什么:something

wait.until(ExpectedConditions.refreshed(**something**));

有人可以用一个例子来解释这一点吗?


答案 1

据消息人士透露:

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

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

通常,当您执行此操作时,该对象表示该对象是什么。driver.findElement

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

当您期望发生 DOM 操作,并且希望等到 DOM 中完成操作时,您将使用。refreshed

例:

<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 行执行 say a button.click(),它将抛出一个 StaleReferenceException,因为此时 DOM 已纵。

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


答案 2

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

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

希望这对其他人有帮助。


推荐