Nightwatch .element() 总是使用数组中的最后一个值
Nightwatch .element() always using last value in array
我有一个守夜人测试,我正在测试移动应用程序内容 RSS、CSS 和 HTML 'feeds' 的 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()
调用中它始终是数组中的最后一个值,因此报告看起来是错误的.它总是看起来像:
✓ appContent
TC004-AppContent
✓ W3C RSS Validator page loaded... https://validator.w3.org/feed/
✓ Passed [ok]: https://www.example.com/rss/feed2 valid RSS...
✓ W3C RSS Validator page loaded... https://validator.w3.org/feed/
✓ Passed [ok]: https://www.example.com/rss/feed2 valid RSS..
因此,由于 urlToTest
始终是 最后一个数组值,因此报告现在没有太大帮助,因为没有区分 url 是什么 good/bad。
我尝试在 perform()
调用中包装代码的不同部分,以尝试在需要时将其准确地发送到 运行 但无济于事。
我也在 .execute()
上看到了帖子,但我就是不明白...
非常感谢任何想法。
根据
中描述的 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...')
}
})
}
我有一个守夜人测试,我正在测试移动应用程序内容 RSS、CSS 和 HTML 'feeds' 的 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()
调用中它始终是数组中的最后一个值,因此报告看起来是错误的.它总是看起来像:
✓ appContent
TC004-AppContent
✓ W3C RSS Validator page loaded... https://validator.w3.org/feed/
✓ Passed [ok]: https://www.example.com/rss/feed2 valid RSS...
✓ W3C RSS Validator page loaded... https://validator.w3.org/feed/
✓ Passed [ok]: https://www.example.com/rss/feed2 valid RSS..
因此,由于 urlToTest
始终是 最后一个数组值,因此报告现在没有太大帮助,因为没有区分 url 是什么 good/bad。
我尝试在 perform()
调用中包装代码的不同部分,以尝试在需要时将其准确地发送到 运行 但无济于事。
我也在 .execute()
上看到了帖子,但我就是不明白...
非常感谢任何想法。
根据
.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...')
}
})
}