【问题标题】:How Do I Click All Elements in Selenium Webdriver?如何单击 Selenium Webdriver 中的所有元素?
【发布时间】:2017-12-02 00:14:52
【问题描述】:

更新

我正在使用:

  • 硒 2.53.1
  • Firefox 和 IE11

我一直在尝试用相同的选择器点击所有元素,例如,我想点击标题为"What I Want"的所有元素:

<div id="first_question">
<a class="gibberish1" title="What I Want"></a>
<a class="gibberish2" title="What I Want"></a>
<a class="gibberish3" title="What I Want"></a>
</div>

这是我目前所做的工作:

browser.findElements(by.xpath("//a[@title='What I Want']")).then(function(all_tests){
           for (var i = 0; i < all_tests.length; i++) {
               console.log(all_tests.length);
               all_tests[i].click();
           }
    });

它能够识别出我有三个元素,如果我直接调用每个元素,那么我可以看到它点击按钮。但是,当我想循环点击每个按钮时,我得到一个错误:

“StaleElementReferenceError:元素不再附加到 DOM。”

我还添加了 5 秒的等待时间,但这并没有阻止弹出相同的问题。

我做错了什么?我是 Selenium 的新手,我正试图用 Javascript 来解决这个问题,而不是 Java,这是我在这种情况下找到的示例。

【问题讨论】:

  • 我不使用 javascript,所以我不知道语法,但最后一次尝试使用 for 循环看起来最接近。问题是您正在单击一个集合,而不仅仅是一个元素。在您的 for 循环中,您需要类似 all_tests[i].click() 的内容,因此您单击循环实例。
  • 嗨@JeffC,你是对的。我把它改成了。只是现在我收到了我在下面评论过的 StaleElementError 问题,我正在努力解决这个问题。
  • 我认为首先打印 all_tests,检查输出,for 循环中的更改可以工作............ ................. 对于 all_tests 中的元素: element.click() .................................. ..并处理 StaleElementReferenceError,可以在这里查看:stackoverflow.com/questions/27003423/…

标签: javascript selenium selenium-webdriver


【解决方案1】:

您需要一一找到它们,在页面重新加载时您的对象将丢失并且您将获得陈旧元素异常。

1) 查找所有链接
2)将属性/属性保存在列表/数组中,可以帮助您识别每个链接
3)创建一个循环,在其中为每个属性搜索元素并单击它

【讨论】:

  • 这是一个额外的问题,但这并不能回答问题。这仅适用于超链接重新加载页面或导航到新页面的情况。当前问题中没有任何内容表明其中任何一个正在发生或与该问题有关。
  • @JeffC 似乎当我选择属性时,它正在刷新 DOM,因为我现在收到“StaleElementReferenceError:元素不再附加到 DOM”。
【解决方案2】:

将我的评论移至答案...

  1. 第一个问题是您的代码尝试单击一个集合而不是单个元素。有几种方法可以做到这一点,其中一种是执行for 循环并访问循环内的各个元素,例如all_tests[i].click();
  2. 过时元素的第二个问题是因为通过刷新页面或导航到新页面来更改 DOM。如果问题是单击导致导航,您可以遍历所有A 标签并将hrefs 存储在字符串数组中。然后您可以遍历该字符串数组并导航到每个存储的href 等。

    另一种处理方法是使用索引抓取页面,而不是将集合存储在循环之外。一个简单的例子是

    这是 Java/伪代码,您必须将其翻译成您使用的任何语言,但这个概念应该有效。

    for (int i = 0; i < driver.findElements(locator).length; i++)
    {
        // scrapes the page each iteration to avoid the stale element exception
        driver.findElements(locator)[i].click();
        // do stuff and get back to the original page, if navigated
    }
    

【讨论】:

    【解决方案3】:

    我认为首先打印 all_tests,检查输出和更改 for 循环可以工作

    对于 all_tests 中的元素:element.click()

    要处理 StaleElementReferenceError,可以在这里查看:
    StaleElementReferenceException on Python Selenium

    注意:未经测试但处理了同样的问题。

    【讨论】:

      猜你喜欢
      • 2020-12-22
      • 2014-04-02
      • 1970-01-01
      • 2012-08-10
      • 2016-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      相关资源
      最近更新 更多