我使用Java实现了很多Selenium测试—有时,我的测试会因为StaleElementReferenceException而失败。
你能建议一些使测试更稳定的方法吗?
Kenny的解决方案很好,但可以用更优雅的方式编写
new WebDriverWait(driver, timeout)
.ignoring(StaleElementReferenceException.class)
.until((WebDriver d) -> {
d.findElement(By.id("checkoutLink")).click();
return true;
});
或者也:
new WebDriverWait(driver, timeout).ignoring(StaleElementReferenceException.class).until(ExpectedConditions.elementToBeClickable(By.id("checkoutLink")));
driver.findElement(By.id("checkoutLink")).click();
但无论如何,最好的解决方案是依赖Selenide库,它处理这类事情等等。(它处理代理而不是元素引用,因此您永远不必处理陈旧的元素,这可能非常困难)。Selenide
我断断续续地遇到这个问题。我不知道,BackboneJS正在页面上运行并替换我试图单击的元素。我的代码看起来像这样。
driver.findElement(By.id("checkoutLink")).click();
当然,功能上与此相同。
WebElement checkoutLink = driver.findElement(By.id("checkoutLink"));
checkoutLink.click();
偶尔会发生的情况是,javascript会在查找和单击它之间替换checkoutLink元素,即。
WebElement checkoutLink = driver.findElement(By.id("checkoutLink"));
// javascript replaces checkoutLink
checkoutLink.click();
这在尝试单击链接时理所当然地导致了StaleElementReferenceException。我找不到任何可靠的方法来告诉WebDriver等到javascript运行完毕,所以下面是我最终如何解决它的。
new WebDriverWait(driver, timeout)
.ignoring(StaleElementReferenceException.class)
.until(new Predicate<WebDriver>() {
@Override
public boolean apply(@Nullable WebDriver driver) {
driver.findElement(By.id("checkoutLink")).click();
return true;
}
});
此代码将持续尝试单击链接,忽略StaleElementReferenceExceptions,直到单击成功或达到超时。我喜欢这个解决方案,因为它避免了您编写任何重试逻辑,并且只使用WebDriver的内置结构。
如果页面上发生的DOM操作暂时导致元素无法访问,则可能会发生这种情况。为了考虑到这些情况,您可以尝试在循环中多次访问该元素,然后最终抛出异常。
请尝试darrelgrainger提供的这一优秀解决方案。blogspot。com:
public boolean retryingFindClick(By by) {
boolean result = false;
int attempts = 0;
while(attempts < 2) {
try {
driver.findElement(by).click();
result = true;
break;
} catch(StaleElementException e) {
}
attempts++;
}
return result;
}
我被困在编写Python Selenium脚本中,似乎无法令人满意地解决我得到的这个StaleElementReistrceException。 我加载了我的页面,然后单击一个按钮,打开一个表单,允许用户向订单中添加新的信用卡。在这一点上,我做了一个WebDriverWait来暂停脚本,直到这个表单上的Save按钮变为可见。此时,重新创建页面对象,因为它已更改,我的目的是填充字段并保存卡片。 问题
问题内容: 在我的一个Selenium测试案例中,我有一个问题,我不想拥有MouseOver效果。这是我的工作: 点击“登录”按钮(页面右上方) 等待页面加载 单击搜索结果中的“购买”按钮(页面右中角)。 问题是,在“登录”和“购买”之间的中间存在一个带有MouseOver效果的“购物篮”链接。因此,当我在“登录”按钮上调用Click(),然后在“购买”按钮上调用时,我会触发MouseOver,这
问题内容: 我正在尝试通过从客户端向服务器发送密钥和随机数来认证用户。 我的代码未向我显示客户端的响应。执行下面的代码时,我得到了一个空指针异常。 问题答案: 解决大多数问题的固定步骤: 阅读堆栈跟踪以确定哪一行代码引发NPE 在该行代码处设置一个断点 使用调试器,在遇到断点时,确定该行中的对象引用是 弄清楚为什么引用该文件(到目前为止,这是唯一实际的困难部分) 解决根本原因(也可能很困难)
问题内容: 我有两个简单的Java代码。第一个将恒定功率定义为power = a.pow(b); 第二个将恒定功率定义为power = BigInteger.ONE.shiftLeft(b) 在命令行中设置内存标志- Xmx1024m,第一个代码可以正常工作,但是第二个代码却出现错误:java.lang.OutOfMemoryError:Java堆空间 我的问题:我应该在第二个代码中更改什么以避免
问题内容: 我有一个用于将文本添加到现有.doc文件中的代码,它将通过使用apache POI将其另存为另一个名称。 以下是到目前为止我尝试过的代码 以下是我得到的 我已经添加了与此对应的所有jar文件,但仍然找不到解决方案。我对apache poi是陌生的,所以请帮我提供一些解释和示例。谢谢 问题答案: 从我对问题的评论中复制: 看起来您需要Apache POI发行版中的poi-ooxml-sc
问题内容: 我的页面包含一堆表格。我在外循环中遍历表,然后在内循环中遍历表中的每一行。一切正常。但是某些页面具有“下一步”按钮。当我在完成页面后添加代码以单击该代码时,则在遍历表的各行时开始获取StaleElementReferenceException。 这是代码: 我不明白的是,为什么过时的因素根本没有发生?该页面在循环过程中没有更改,我一直等到所有元素都提取完之后。如何避免StaleElem