我正在浏览ExpectedCondtions
类的方法并找到一种方法:refreshed
我可以理解,当你获得StaleElementReferenceException
并希望再次检索该元素时,可以使用该方法,这样可以避免StaleElementReferenceException
我的上述理解可能不正确,因此我想确认一下:
refreshed
?something
部分的代码应该是什么: wait.until(ExpectedConditions.refreshed(**something**));
有人可以用一个例子解释一下吗?
答案 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();
希望这对其他人有帮助。