【问题标题】:How to resolve Stale element while looping through all the buttons?循环遍历所有按钮时如何解决陈旧元素?
【发布时间】:2018-11-02 03:53:59
【问题描述】:

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

    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 个)。目前,如上面的代码部分所示,有一个带有两个按钮的弹出窗口(背景褪色)。

在 selenium 中,它会将 StaleElementReferenceException: stale element reference: element is not attached to the page document 扔到 b.getTagName() 的行上。

不确定是什么原因造成的。已经尝试过: 1.隐式等待30秒。 2.XPath选择器 3.循环多次轮询和try-catch块 ...如其他答案中所述。为所有可能的解决方案获得相同的例外。

这可能是什么原因?

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

【问题讨论】:

  • 你试过显式等待吗?喜欢org.openqa.selenium.support.ui.Wait.until()ExpectedConditions.elementToBeClickable()
  • 你可以这样做:driver.findElements(By.xpath("//div[@class='btn btn-primary' and @data-bb-handler ='yes']")对于“任务状态”按钮?您能否显示更多 HTML,也许有一种方法可以捕获您需要的元素?
  • 你能分享一下代码吗:在循环中多次轮询和 try-catch 块?我认为它应该工作!
  • @MadhavCp 你能用你需要getTagName()getText()buttons 的确切用例 更新问题吗?

标签: java selenium testing xpath css-selectors


【解决方案1】:

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

【讨论】:

  • 非常感谢您的所有回复。我可以观察到在将 Xpath 键入为 //*[@class='btn btn-primary'][1] 后问题得到解决,唯一的问题是单击按钮后加载页面需要更多时间。
【解决方案2】:

来自documentation

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

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

这些是可能导致此异常的常见原因。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 2021-03-15
    • 2015-07-24
    相关资源
    最近更新 更多