【问题标题】:Use selenium to input multiple elements using xpath使用 selenium 使用 xpath 输入多个元素
【发布时间】:2017-03-01 11:30:15
【问题描述】:

我是 Selenium 的新手,所以我不确定这是否是解决问题的最佳方法,但我正在寻找一种方法来使用 xpath(或 css)来定位一系列输入元素并以某种方式遍历所有这些并在其中输入一些文本。

类似于以下内容:

<form>
  value1 <input type="text" placeholder="value1"><br>
  value2 <input type="text" placeholder="value2"><br>
  value3 <input type="text" placeholder="value3"><br>
</form>

我可以使用这个来定位元素:

var input = driver.findElement(By.xpath("//input[@type='text']"))

我可以输入 xpath 找到的元素的第一个匹配项:

input.sendKeys('Some text')

这就是我卡住的地方。我不确定如何在第一个之后将值输入到输入字段中。

最终,我想做的是以某种方式将文本发送到 xpath 过滤器所在的所有输入字段。我在想可能有一个 for 循环,但我不确定如何使用 webdriverjs 使用的承诺管理器来做到这一点。

这是可能的还是有更好的方法来做到这一点?

【问题讨论】:

  • 会有一个 findElements 方法,它是您正在使用的复数形式。这将返回一个列表,您可以对其进行迭代并输入值。单数 findelement 将始终返回它在页面中找到的第一个匹配元素。
  • 谢谢,这让我更进一步。仍在尝试找出如何迭代元素。
  • @Grasshopper 谢谢,这篇文章帮助我指出了正确的方向。

标签: javascript node.js selenium xpath selenium-webdriver


【解决方案1】:

您可以执行以下操作

driver.findElements(By.xpath("<xpath>")).then(function(elem) {
    for(var i=0; i<elem.length; i++){
        driver.findElements(By.xpath("<xpath>")).get(i).sendKeys('some Text');
    }
});

只需用您发送文本的元素的 xpath 替换即可。通常您可以使用 .get() 从 .findElements() 返回的元素列表中选择特定元素

【讨论】:

  • 感谢您的回复。我希望将文本发送到所有元素而不是特定索引。有没有简单的方法可以做到这一点?
  • 你可以遍历 findElements() 返回的所有元素然后发送,但是没有办法一次性发送。您将不得不使用某种形式的迭代。 :(
  • 很高兴知道。我不介意单独发送它们,所以我会尝试弄清楚如何迭代所有元素,我不知道该怎么做。
  • 这对我不起作用,我可能做错了什么。我会继续看下去的。
  • 我不断收到TypeError: driver.findElements(...).get is not a function
【解决方案2】:

你应该尝试使用forEach,当必须对所有具有公共选择器的元素采取相同的操作时:-

driver.findElements(By.css("input[type='text']")).then(function(elements) {
  elements.forEach(function (input) {
      input.sendKeys('Some text');
  })
});

或者,如果您想使用 promise 做同样的事情,您需要参考 Selenium 的承诺,如下所示:-

var promise = require('selenium-webdriver').promise;
var elements = driver.findElements(By.css("input[type='text']"))
promise.all(elements).then(function (input) {
     input.sendKeys('Some text');
});

【讨论】:

  • .each 似乎是最干净的方法,但我收到了TypeError: elements.each is not a function,不知道为什么。
  • @jmreicha 抱歉,应该是forEach。尝试更新答案并告诉我..
  • 我也这么认为,但由于某种原因它仍然无法正常工作:/ 获取TypeError: elements.forEach is not a function
  • 你的回答让我走上了正确的道路,我必须将元素包装在一个承诺中,然后我才能使用 forEach 循环。
【解决方案3】:

我在这篇文章中的其他人的帮助下找到了答案。下面是工作代码的样子:

driver.findElements(By.css("input[type='text']"))
.then(function (inputs) {
    inputs.forEach(function (input) {
        input.sendKeys(password)
    })
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    相关资源
    最近更新 更多