与实习生一起测试异步页面更改
Test async page changes with the intern
假设我在页面上有一个按钮和一个 div 元素。
<button /><div>old text</div>
通过单击按钮,javascript 异步更改 div 的文本(即在 ajax 调用之后)。我如何与实习生一起测试它?
这不起作用:
function testButtonClick() {
return command
.findByTagName('button')
.click()
.end()
.findByTagName('div')
.getVisibleText()
.then(function(text) { assert.strictEqual(text,'new text')}); //errror, text is 'old text'
}
如果我在 .end()
之后添加 .sleep(5000)
,那么它工作正常(因为我的异步请求通常在 5 秒内完成)。但我不想等那么久,因为异步通常会更早完成。
但是使用时间值较低的睡眠,我冒着在请求完成之前对其进行测试的风险。
有没有更好的方法?
最有效的解决方案是使用 pollUntil
,例如:
return command
.findByTagName('button')
.click()
.end()
.then(pollUntil(function () {
var el = document.getElementByName('div');
if (el && el.textContent === 'new text') {
return true;
}
}, 5000));
轮询直到将 运行 浏览器上下文中的函数重复,直到它 returns 一个非空、非未定义的答案,或者直到它超时。在上面的代码片段中,轮询函数 returns 如果元素存在并且具有预期的文本则为真,否则为未定义。它会在 5000 毫秒后超时,但它会在预期的文本出现后立即结束。
假设我在页面上有一个按钮和一个 div 元素。
<button /><div>old text</div>
通过单击按钮,javascript 异步更改 div 的文本(即在 ajax 调用之后)。我如何与实习生一起测试它?
这不起作用:
function testButtonClick() {
return command
.findByTagName('button')
.click()
.end()
.findByTagName('div')
.getVisibleText()
.then(function(text) { assert.strictEqual(text,'new text')}); //errror, text is 'old text'
}
如果我在 .end()
之后添加 .sleep(5000)
,那么它工作正常(因为我的异步请求通常在 5 秒内完成)。但我不想等那么久,因为异步通常会更早完成。
但是使用时间值较低的睡眠,我冒着在请求完成之前对其进行测试的风险。
有没有更好的方法?
最有效的解决方案是使用 pollUntil
,例如:
return command
.findByTagName('button')
.click()
.end()
.then(pollUntil(function () {
var el = document.getElementByName('div');
if (el && el.textContent === 'new text') {
return true;
}
}, 5000));
轮询直到将 运行 浏览器上下文中的函数重复,直到它 returns 一个非空、非未定义的答案,或者直到它超时。在上面的代码片段中,轮询函数 returns 如果元素存在并且具有预期的文本则为真,否则为未定义。它会在 5000 毫秒后超时,但它会在预期的文本出现后立即结束。