使用nightwatch.js断言webelements列表的文本值

时间:2015-05-12 14:30:59

标签: javascript node.js selenium nightwatch.js

我是使用nightwatch.js的新手。 我想获得一个元素列表,并使用给定的字符串验证每个元素的文本值。 我试过了:

function iter(elems) {
      elems.value.forEach(function(element) {
        client.elementIdValue(element.ELEMENT)
      })
    };
    client.elements('css selector', 'button.my-button.to-iterate', iter);

另一个stackoverflow问题 但我现在正在使用的是

waitForElementPresent('elementcss', 5000).assert.containsText('elementcss','Hello')

它正在返回输出

Warn: WaitForElement found 5 elements for selector "elementcss". Only the first one will be checked.

所以我希望它能够验证列表中每个元素的文本值。

5 个答案:

答案 0 :(得分:7)

所有的事情都不能通过nightwatch js简单命令来完成,所以他们提供了自定义命令意味着selenium协议。在这里,您可以拥有所有selenium protocol。我使用以下代码来断言每个元素的文本值,并使用给定的字符串" text"。希望它能帮到你

    module.exports = {
  '1. test if multiple elements have the same text' : function (browser) {
    function iter(elems) {
       elems.value.forEach(function(element) {
        browser.elementIdText(element.ELEMENT, function(result){
          browser.assert.equal(result.value,'text')
        })
       })
     };

    browser
      .url('file:///home/user/test.html')
      .elements('tag name', 'a', iter);

    }

  };

我的HTML代码段



<div id="test">
<a href="google.com" class='red'> text </a>
<a href="#" class='red'> text </a>
<a href="#" class='red'> text 1</a>
</div>
&#13;
&#13;
&#13;

答案 1 :(得分:2)

我能够做到:

.elements('css selector', 'cssValue', function (elements) {
        for(var i=0;i<elements.value.length;i++){
        var elementCss = 'div.search-results-item:nth-child(' + (i+1) + ') span';
            client.assert.containsText(elementCss,'textValue');
        }
        })

答案 2 :(得分:1)

将你的函数iter放在for循环中,然后再使用

client.elements('css selector', '#CollectionClass', function (result) {
  if(result.value.length > 1) {   
     var count;
     for(count=1; count<result.value.length; count++) {
       result.value.forEach(function(element) {
       client.elementIdValue(element.ELEMENT);
       client.elementIdText(selectedHighlight.ELEMENT, function(resuddlt) {
         this.assert.equal(typeof resuddlt, "object");
         this.assert.equal(resuddlt.status, 0);
         this.assert.equal(resuddlt.value, "your value");
      });
     }     
   }
  }
};

答案 3 :(得分:0)

您已经说明了您尝试过的内容(这很好),但您还没有向我们展示用于演示问题的清理HTML(这会降低可能答案的准确性)。

HTML中有许多方法可以包含信息,内置的Nightwatch containsText将序列化它在包含子结构的结构中找到的任何文本。

所以,例如,如果你有Juhi建议,

<div id="test">
<a href="google.com" class='red'> text </a>
<a href="#" class='red'> text </a>
<a href="#" class='red'> text 1</a>
</div>

然后是断言

.verify.containsText('#test', ' text ') // first one
.verify.containsText('#test', ' text ') // second one
.verify.containsText('#test', ' text 1') // third one

将通过,因为它们每个都验证特定信息而无需编写循环。 Nightwatch将查看test元素并将元素序列化为字符串text text text 1

现在,如果你因为其他原因需要一个循环,这都是学术性的,但你原来的问题似乎是针对如何获取文本信息,而不一定是如何执行一个可能的问题解决方案(写一个循环)。

答案 4 :(得分:0)

我创建了自定义断言-custom-assertions/hasItems.js,内容为:

exports.assertion = function hasItems(selector, items) {
  this.message = `Testing if element <${selector}> has items: ${items.join(", ")}`;
  this.expected = items;
  this.pass = selectedItems => {
    if (selectedItems.length !== items.length) {
      return false;
    }
    for (let i = 0; i < selectedItems.length; i++) {
      if (selectedItems[i].trim() !== items[i].trim()) {
        return false;
      }
    }
    return true;
  };
  this.value = res => res.value;
  function evaluator(_selector) {
    return [...document.querySelectorAll(_selector)].map(
      item => item.innerText
    );
  }
  this.command = cb => this.api.execute(evaluator, [selector], cb);
};