检查是否有一个div包含我在夜间的值

问题描述:

我在使用nightwatch.js测试我的webapp时遇到了问题。我需要迭代页面上的所有div元素来检查是否有包含我之前添加的所有子元素的元素。例如我有:检查是否有一个div包含我在夜间的值

<div className = 'myclass'> 
    <h2> text1 </h2> 
    <h3> second_text1 </h3> 
</div> 
<div className = 'myclass'> 
    <h2> text2 </h2> 
    <h3> second_text2 </h3> 
</div> 

我想检查一个div是否包含'text2'和'second_text2'。我尝试添加iter函数,如下所示:Assert text value of list of webelements using nightwatch.js但我不知道如何检查此div中的子元素并仅在没有div包含我的值时才声明。

不幸的是,nightwatch不支持承诺或一般异步非常好。博客文章here总结了一些痛点。

幸运的是,可以使用browser.elementsbrowser.perform的组合。

var assert = require('assert'); 

module.exports = { 
    'foobar': function (browser) { 
     var isTextFound = false; 
     browser 
      .url('http://localhost:3000') 
      .waitForElementVisible('body', 1000); 

     browser.elements('css selector', '.myclass', function (res) { 
      res.value.forEach(function (jsonWebElement) { 
       var jsonWebElementId = jsonWebElement.ELEMENT; 
       browser.elementIdText(jsonWebElementId, function (jsonElement) { 
        var text = jsonElement.value; 
        if (text.indexOf('text1') !== -1 && text.indexOf('second_text') !== -1) { 
         isTextFound = true; 
        } 
       }); 
      }); 
     }); 
     browser.perform(function() { 
      assert.ok(isTextFound, 'Text found'); 
     }); 


     browser.end(); 
    } 
} 

让我们通过一些关键点

require('assert')

这是因为nightwatch断言只对DOM元素进行操作,因此你不能断言一个布尔值是必需的。这也意味着报告中不会显示断言,但是如果它是错误的,它会抛出一个错误,这将会出现。

browser.perform(function(){...})

这使断言到命令队列,这样的断言之后会发生。如果不存在,评估将立即发生并且断言将失败。

browser.elements('css selector, '.myclass', function(res){...})

这是使用elements api。请注意,webdriver协议部分下的api不直接返回Web元素,而是返回Web元素(WebElement JSON对象)的Selenium表示,因此我们必须使用特殊方法(如elementIdText)从中获取信息。