【问题标题】:Nightwatch .element() always using last value in arrayNightwatch .element() 总是使用数组中的最后一个值
【发布时间】:2019-07-19 15:58:45
【问题描述】:

我有一个守夜测试,我正在测试移动应用内容 RSS、CSS 和 HTML“提要”的 url 列表。它们位于如下数组中:

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() 调用中,它始终是数组中的最后一个值,因此报告看起来是错误的。它总是看起来像:

✓ 应用内容

TC004-AppContent

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

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

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

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

所以,由于urlToTest始终最后一个数组值,因此该报告目前没有太大帮助,因为它没有区分哪些 url 是好/坏。 我尝试将代码的不同部分包装在perform() 调用中,试图让它在需要时准确运行,但无济于事。

我也在.execute() 上看到了帖子,但我就是不明白...

非常感谢任何想法。

【问题讨论】:

    标签: javascript nightwatch.js


    【解决方案1】:

    根据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...')
            }
        })
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多