2017-03-04 84 views
2

我在使用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包含我的值時才聲明。

回答

2

不幸的是,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)從中獲取信息。

相關問題