与实习生一起测试异步页面更改

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 毫秒后超时,但它会在预期的文本出现后立即结束。