检查其中一个div是否包含我的守夜值

abi*_*irl 5 javascript testing automated-tests nightwatch.js

我用nightwatch.js测试我的Web应用程序时遇到问题。我需要遍历页面上的所有div元素,以检查是否存在包含我之前添加的所有子元素的对象。例如,我有:

<div className = 'myclass'>
    <h2> text1 </h2>
    <h3> second_text1 </h3>
</div>
<div className = 'myclass'>
    <h2> text2 </h2>
    <h3> second_text2 </h3>
</div>
Run Code Online (Sandbox Code Playgroud)

我想检查div之一是否同时包含:“ text2”和“ second_text2”。我试图添加如下所示的iter函数:使用nightwatch.js声明Webelements列表的文本值,但我不知道如何检查该div中的子元素,并且仅当没有div包含我的值时才断言。

der*_*erp 4

不幸的是,nightwatch 不能很好地支持承诺或一般异步。这里的博客文章总结了一些痛点。

幸运的是,可以使用browser.elements和的组合browser.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();
    }
}
Run Code Online (Sandbox Code Playgroud)

让我们来看看一些关键点

require('assert')

这是必需的,因为 nightwatch 断言仅对 DOM 元素进行操作,因此您无法断言布尔值。这也意味着该断言不会显示在报告中,但是如果它是假的,则会抛出错误并出现此错误。

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

这会将断言放入命令队列,以便断言随后发生。如果不存在,评估将立即发生并且断言将失败。

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

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