如何在循环浏览所有按钮时解决过时元素?



作为更大测试的一部分,我必须单击一个没有分配ID的特定按钮。在浏览并尝试了堆栈溢出上的各种其他解决方案后,我想简单地遍历所有按钮 - 然后考虑如何单独选择它并单击它。代码如下:

List<WebElement> buttons = driver.findElements(By.cssSelector(".btn.btn-primary"));
for (WebElement b:buttons) {
System.out.println(b.getTagName());
System.out.println(b.getText());
}

该按钮是使用 Jquery 动态生成的。实际网页只是.js引用的集合。这是我从Inspect Element获得的代码:

<div class="modal-footer">
<button class="btn btn-primary" type="button" data-bb-handler="yes">Task Status</button>
<button class="btn btn-primary" type="button" data-bb-handler="danger">Close</button>
</div>

此网页上有超过 20 个按钮(现阶段几乎看不到 4-5 个(。目前,有一个弹出窗口(背景褪色(,其中包含两个按钮,如上面的代码部分所示。

在硒中,它把StaleElementReferenceException: stale element reference: element is not attached to the page document扔在说b.getTagName()的线上

。不确定可能导致此问题的原因。已经尝试过: 1. 隐式等待 30 秒。 2.XPath选择器 3. 在循环中多次轮询和 try-catch 块 ...正如其他答案中提到的。为所有可能的解决方案获得相同的异常。

可能是什么原因造成的?

附言无法共享屏幕截图,因为这是一个专有的企业应用程序。

一种解决方法是将其放在try-catch块中,捕获StaleElementReferenceException并且什么都不做。

从文档中:

在以下两种情况之一中引发过时元素引用异常,即 第一个比第二个更常见:

  • 该元素已被完全删除。
  • 元素不再 附加到 DOM。

以下是可能导致此异常的常见原因。

在你的问题中,没有很多信息,但考虑到你写的内容,你似乎是:

  • 使用 CSS 选择器".btn.btn-primary">获取所有元素的引用
  • 执行一些操作(更改 DOM(
  • 并在尝试与以前的引用进行交互之后。

如果这样做,则需要在尝试获取标记名/文本时重新定位driver.findElements(By.cssSelector(".btn.btn-primary"))元素。

最新更新