如何单击Selenium Webdriver中的所有元素?

时间:2017-06-28 14:43:58

标签: javascript selenium selenium-webdriver

更新

我在Firefox和IE11上使用Selenium 2.53.1。

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

<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();
           }
    });

它能够识别出我有三个元素,如果我直接给每个人打电话,那么我可以看到它点击按钮。但是,当我想循环以便点击每个按钮时,我得到一个&#34; StaleElementReferenceError:元素不再附加到DOM。&#34;我还加了5秒的等待,但这并没有阻止弹出相同的问题。

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

帮助:(

3 个答案:

答案 0 :(得分:0)

你需要逐个找到它们,在页面上重新加载你的对象会丢失,你会得到过时的元素异常。

1)找到所有链接
2)在列表/数组中保存属性/属性,可以帮助您识别每个链接 3)创建一个循环,对于要搜索元素的每个属性,然后单击它

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

  
    
      

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

    
  

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

要处理StaleElementReferenceError,可以在此处进行检查:
StaleElementReferenceException on Python Selenium

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