gpt4 book ai didi

java - Selenium:如何判断 RemoteWebDriver.findElements(By) 是否可以抛出 StaleElementReferenceException?

转载 作者:行者123 更新时间:2023-11-30 02:05:48 26 4
gpt4 key购买 nike

据我了解such exception仅当代码对 WebElement 实例进行操作,并在重新加载或删除相应的 DOM 元素后调用其方法时,才会抛出该异常。

因此,为了查明 RemoteWebDriver.findElements(By) 是否可以抛出该异常,我在 RemoteWebDriver 实现的源代码中查找了此类代码WebDriver 接口(interface)(在 selenium-remote-driver-3.8.1.jar 中)。但深入了解 RemoteWebDriver 的代码的调用堆栈最终对我来说变得太困难了。

所以我的问题是:除了尝试通过检查 Selenium 源代码来弄清楚这一点之外,是否有更好的方法来判断 WebDriver 方法是通用的 - 还是只是 findElements(By) 特别是 - 可以抛出 StaleElementReferenceException 吗?这是一个 RuntimeException,Selenium JavaDoc 没有针对它的 @throws

最佳答案

您查明了有关“StaleElementReferenceException”的问题,这与 webElement 实例更改、DOM 由于页面上的某些 Activity 而更改时相关。

这与 WebDriver 内部如何处理对 webElements 的引用有关,当运行时对对象的引用发生更改时,会发生此问题。

现在,让我们假设当您获取元素并对其执行任何操作之前,页面上的某些内容已刷新。可能是整个页面正在刷新,也可能是某些调用仅刷新了元素所在的 DOM 部分。

在这种情况下,WebDriver 使用并存储在缓存中的内部 id 已过时(不再引用),因此现在对于此 WebElement 上的每个操作,我们将得到 StaleElementReferenceException

因此,为了尽量避免在关键位置尝试使用此方法,以确定元素是否过时。

public static boolean isStale(WebElement e){
try{
e.isDisplayed();
return false;
}catch(StaleElementReferenceException ex){
return true;
}
}

通常,刷新页面、pageObject 或仅刷新此特定元素在 90% 的情况下都会有所帮助。

刷新页面/元素后,WebDriver 将为该元素分配一个不同的内部 ID,并且可以毫无问题地再次使用它。

这个问题可以通过 PageObject/PageFactory 设计模式来解决。

public class SomePage {
@FindBy(how = How.NAME, using = "q")
private WebElement searchBox;


public SomePage() {
PageFactory.initElements(driver, this);
}


public void searchFor(String text) {
searchBox.sendKeys(text);
}
}

希望这有帮助,

关于java - Selenium:如何判断 RemoteWebDriver.findElements(By) 是否可以抛出 StaleElementReferenceException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51419727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com