java 如何以及何时实现Selenium WebDriver的refreshed(ExpectedCondition< T>条件)?

7d7tgy0s  于 2023-05-21  发布在  Java
关注(0)|答案(3)|浏览(213)

我正在检查ExpectedCondtions类的方法,发现了一个方法:刷新
我可以理解,当您获取StaleElementReferenceException并希望再次检索该元素时,可以使用该方法,这种方法可以避免StaleElementReferenceException
我的上述理解可能不正确,因此我想确认:
1.什么时候应该使用refreshed
1.以下代码中something部分的代码应该是什么:
wait.until(ExpectedConditions.refreshed(**something**));
有人能举个例子解释一下吗?

qc6wkl3g

qc6wkl3g1#

在尝试访问新刷新的搜索结果时,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();

希望这对其他人有帮助。

ztigrdn8

ztigrdn82#

据来文方称:
条件的 Package 器,允许通过重绘来更新元素。这围绕具有两个部分的条件的问题工作:找到一个元素,然后检查它的某些条件。对于这些情况,可以定位元素,然后随后在客户端上重绘该元素。当发生这种情况时,在检查条件的第二部分时会抛出{@link StaleElementReferenceException}。
所以基本上,这是一个等待直到对象上的DOM操作完成的方法。
通常,当执行driver.findElement时,该对象表示该对象是什么。
当DOM被操作后,比如说在单击一个按钮后,向该元素添加一个类。如果你尝试对该元素执行一个操作,它将抛出StaleElementReferenceException,因为现在返回的WebElement并不代表更新后的元素。
当您希望进行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行执行button.click(),它将抛出StaleReferenceException,因为此时DOM已被操作。

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

bkhjykvo

bkhjykvo3#

应该是这样的

wait.until(ExpectedConditions.refreshed(ExpectedConditions.presenceOfElementLocated(By.id("myBtn"))));

相关问题