使用NightWatchJS迭代元素

时间:2014-12-11 20:04:58

标签: automation nightwatch.js

如何点击夜视中的elements命令返回的按钮

client.elements('xpath', ".//a[@class='abcd')]", function (allButtons){
        console.log('Element value is '+element)
        allButtons.value.forEach(function (element) {
            this.elementIdClick(element, function(res){});
    }
}

正在运行时我收到错误

  

元素值是[object Object]

TypeError: Object #<Object> has no method 'elementIdClick'

那么如何从client.elements

返回的元素列表中获取每个元素

我意识到elementIdClick的参数是错误的,我将代码更新为

client.elements('xpath', ".//a[@class='abcd')]", function (allButtons){

allButtons.value.forEach(function (element) {
    console.log('Element value is '+element)
    this.elementIdClick(this.elementIdAttribute(allButtons.value[element].ELEMENT, 'id'), function(res){});

现在错误是

Element value is [object Object]
    TypeError: Cannot read property 'ELEMENT' of undefined

再次回到原始问题。如何使用nightwatchJS

从webelements列表中获取单个元素

3 个答案:

答案 0 :(得分:3)

以下对我有用:

function iter(elems) {
    elems.value.forEach(function(element) {
        client.elementIdClick(element.ELEMENT)
    })
};
client.elements('css selector', 'button.my-button.to-iterate', iter);
  • 每个element都是{ ELEMENT: string }形式的 JSON 对象(因此,本身没有方法。)
  • {li> this forEach 指向elementclient:您需要调用client.elementIdClick()或将{}获得TypeError

希望它有所帮助。

答案 1 :(得分:1)

我使用以下策略使用Nightwatch迭代DOM元素:

// Executing a function in the application context.
client.execute(function () {

  // Get elements by CSS selector.
  var elements = document.querySelectorAll('.elements');

  // Iterate over them.
  [].forEach.call(elements, function (element) {

    // Manipulate each element.
    element.click();
  });
});

当然,该片段在测试中。

如果您使用jQuery或类似的东西,也可以使用它。

答案 2 :(得分:0)

我认为错误是由console.log()语句生成的。

从elements()命令,allButtons.value将是多个对象的数组。要访问该数组中的密钥对,您需要指定数组中的位置,然后引用该对象:allButtons.value[index].ELEMENT

因为您只为一个arg提供了.forEach()循环,所以它将index解释为array,并在下面的代码示例中替换了您的本地变量{{1} } element为清晰起见。也不需要使用.elementIdAttribute()函数; index返回的号码将作为ID。

allButtons.value[0].ELEMENT

希望有所帮助。