当前位置: 首页 > 知识库问答 >
问题:

Selenium StaleElementReferenceException状态元素引用异常

楚俊逸
2023-03-14

嗨,我是硒的新手

我正在使用Java库,已经尝试了ChromeFirefox驱动程序。

我正在运行一个循环。有趣的是,循环有时会工作3、2次,它并不总是在同一次迭代中失败。我假设它与某种竞争条件有关(例如等待页面加载)。如果我在调试模式下运行,它似乎可以完美地工作。

我已经尝试了其他答案的建议,比如显式等待和隐式等待,但仍然没有帮助。也许如果你看到密码你可以帮我一把。

这是一个循环。

WebDriverWait wait = new WebDriverWait(driver,20);
WebElement searchResults = driver.findElement(new By.ById("searchresults"));
searchResults = searchResults.findElement(new By.ByClassName("table"));
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.tagName("a")));
List<WebElement> list=searchResults.findElements(By.tagName("a"));
for(WebElement w: list) {
  result.add(w.getAttribute("href")); //EXCEPTION HAPPENS ALWAYS HERE
}

解决方案

解决方案是彻底破解。我仍然不明白,但它确实起作用了。如果有人明白为什么,请告诉我。

我只是将所有等待向上移动,它会表现得更好。我还接受了@Cyril的建议,如果异常被抛出一些数据检查以确保我得到了我想要的一切,我将重新运行迭代。

WebDriverWait wait = new WebDriverWait(driver,20);
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(new By.ById("searchresults")));
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(new By.ByClassName("table"))); 
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.tagName("a")));

共有2个答案

鲁英卫
2023-03-14

为了避免StaleElementRe0019 ceException,您可以在查找元素期间获取属性。这是一个片段(nth-child第一个索引为1):

List<WebElement> list=searchResults.findElements(By.tagName("a"));
for(int i = 1; i < list.length; i++) {
   result.add(searchResults.findElement(By.cssSelector("a:nth-child(" + i + ")")).getAttribute("href"));
}

这样,出现异常的唯一机会是元素在findElement和getAttribute之间发生变化,这是不可能的(或者table元素发生变化,搜索结果)。当然,有更好的方法来实现这一点,比如在findElement周围使用包装函数,或者使用页面对象模式,但对于您的情况来说,它应该已经足够了。

编辑:您的解决方案可能有效,因为它使脚本等待页面完全加载,然后元素不再更改。

路欣荣
2023-03-14

StaleElementReferenceException表示您正在访问的DOM元素已更改或从DOM中删除。因此,等到元素可见或存在时才有帮助(之后它们仍然可以得到更新)。

您可能可以通过线程显式等待5秒钟来修复异常。在查找任何DOM元素之前,请先睡眠。

另一个选项是在引发异常时再次查找元素。但它只适用于单个元素。

 类似资料:
  • 我正在尝试自动执行以下操作: 启动https://www.flipkart.com 我在线程“主”状态元素引用中得到期望:元素没有附加到miButton()方法中的页面文档。 请参阅错误详细信息部分。 HTML代码 Mi按钮点击-HTML 基类: 页面类 错误详细信息 线程“main”组织中出现异常。openqa。硒。StaleElementReferenceException:stale ele

  • 在使用Python进行测试驱动开发时,我目前在迁移后立即运行功能测试时遇到了“StaleElementReferenceException”。以下是错误的全文: 以下是测试: 如何配置测试以防止出现这种情况?Selenium自己的页面表示,页面刷新时可能会出现此问题,但这是应用程序逻辑的一个必要部分,因为到目前为止,它已经配置好了。

  • 问题内容: 这是我的用法- 另外,我在http GET周围放置了一个finally块- 这是我的堆栈跟踪- 我正在使用Quartz计划监视Http端点的工作。这是我的连接池配置 Maven依赖..工件版本 编辑 -好吧,通过不关闭finally块中的CloseableHttpClient,问题解决了。有人能说出为什么这样吗? 如果关闭客户端,为什么连接池会关闭? 是上面的closeablehttp

  • 我想返回200以外的HTTP状态,而不使用注释。 这样做的原因是,并不是每次调用我的应用程序(导致状态为not OK)都应该抛出异常,至少在我看来不是这样。 例如,如果一个用户试图登录系统,但提供了一个不准确的密码,我认为没有理由为了能够返回401状态而抛出异常。相反,我希望能够从“常规”方法中返回状态。 这背后的原因是,抛出不必要的异常既弄乱了我的日志文件,又“使用”了我的日志聚合器(Rollb

  • 我正在为一个Spring-Boot应用程序编写组件测试,以测试我的安全配置。因此,我正在运行测试,应该测试成功的响应以及“禁止”状态。我遇到的问题是,由于我的REST调用需要一个复杂的JSON,对于阻塞的调用,测试会失败,因为TestRestTemplate试图反序列化不存在的响应体。 我正在运行一个Spring-Boot应用程序,tests类的注释如下: 我试图测试一个应该返回用户列表的REST

  • 好的,我阅读了所有其他的链接,我尝试了上述不同解决方案的变体,但是它们都不适合我。 我的问题是,我有以下代码: 然而,我得到了以下错误: 这是篮子图标的css路径,它在菜单上。 网站是GWT,步骤如下:1。点击物品添加到购物篮2。增加到第三篮。点击篮子进入篮子。 然而,我似乎无法做到这一点。