Nightwatch .element()始终使用数组中的最后一个值

时间:2019-07-19 15:58:45

标签: javascript nightwatch.js

我进行了一项夜间监视测试,其中测试了移动应用程序内容RSS,CSS和HTML“提要”的网址列表。它们的数组如下:

var rssFeeds = [
'https://www.example.com/rss/feed1',
'https://www.example.com/rss/feed2',
]

在测试中,我使用for循环遍历数组中的每个url进行测试,例如:

var urlToTest = ''; //< -- this is always 'https://www.example.com/rss/feed2' in .element check below
    // rss Feeds
    for (var i = 0; i < rssFeeds.length; i++) {
        urlToTest = rssFeeds[i].toString()
        browser
            .url('https://validator.w3.org/feed/')
            .waitForElementVisible('body', 'W3C RSS Validator page loaded... https://validator.w3.org/feed/ \n')
            .setValue('#url', urlToTest)
            .click('a[class="submit"]')
            .element('css selector', 'img[title="Valid RSS"]', function (result) {
                if (result.value && result.value.ELEMENT) {
                    // Element is present, do the appropriate tests
                    console.log('valid RSS...')
                    browser.perform(function () {
                        browser.verify.ok(1 == 1, urlToTest + ' valid RSS...') //<-- HERE
                    })
                } else {
                    // Element is not present.
                    console.log('invalid RSS...')
                    browser.verify.ok(1 != 1, urlToTest + ' invalid RSS...') //<-- AND HERE
                }
            })
    }

在每个.url()调用中,它会依次正确输入feed1,feed2等,但是,在.element()调用中,它始终是数组中的最后一个值,因此报告看起来不正确。它总是像这样:

  

✓appContent

     

TC004-AppContent

     

✓W3C RSS验证器页面已加载... https://validator.w3.org/feed/

     

✓通过[确定]:https://www.example.com/rss/feed2有效的RSS ...

     

✓W3C RSS验证器页面已加载... https://validator.w3.org/feed/

     

✓通过[确定]:https://www.example.com/rss/feed2有效的RSS。.

因此,由于urlToTest始终是最后一个数组值,因此该报告由于无法区分哪个URL是好是坏,因此现在不是很有帮助。 我尝试在perform()调用中包装代码的不同部分,以尝试使其完全在需要时也无济于事。

我还看到了.execute()上的帖子,但我只是不明白...

任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

根据here所述的javascript问题,我不得不将.element()调用移到循环外的函数中

现在,代码为:

var urlToTest = '';
    // rss Feeds
    for (var i = 0; i < rssFeeds.length; i++) {
        urlToTest = rssFeeds[i].toString()
        browser
            .url('https://validator.w3.org/feed/')
            .waitForElementVisible('body', 'W3C RSS Validator page loaded... https://validator.w3.org/feed/')
            .setValue('#url', urlToTest)
            .click('a[class="submit"]')
            .waitForElementVisible('body', 'W3C results page loaded...')
        checkElement(browser, 'img[title="Valid RSS"]', urlToTest)
    }

// must call from outside loop in order to maintain proper syncronous execution
function checkElement(browser, elem, url) {
    browser.element('css selector', elem, function (result) {
        if (result.value && result.value.ELEMENT) {
            // Element is present, do the appropriate tests
            browser.verify.ok(1 == 1, url + ' valid feed...')
        } else {
            // Element is not present.
            browser.verify.ok(1 != 1, url + ' invalid feed...')
        }
    })
}