如何在zombie.js中使用browser.wait()?

fab*_*tab 15 node.js zombie.js

我有一个Web应用程序,它使用Ajax请求不断轮询来自服务器的数据.我想使用zombie.js为它实现集成测试.

我要做的是等到Ajax轮询循环从服务器接收数据.数据应在20秒后收到,因此我browser.wait(done, callback)用来检查数据是否存在,并设置waitFor为最大超时一分钟.

但是,browser.wait()即使我的done回调返回false ,它也会立即返回.

zombie API文档中,我阅读了以下内容browser.wait():

...它不能永远等待,特别是对于可能反复触发的定时器(例如检查页面状态,长轮询).

我想这就是我看到的行为的原因,但我真的不明白发生了什么.为什么我不能等待一分钟,直到我的轮询循环从服务器接收数据?为什么不能browser.wait()等待可能反复发射的计时器?我需要做些什么来实施我的测试?

小智 3

如果 Zombie.js 正在等待文档准备就绪,则默认情况下,Zombie.js 将等待页面上的所有脚本加载并执行。

如果我理解正确的话,您的脚本只有在文档准备好 20 秒后才会执行。在这种情况下,Zombie 有一个函数可以让您在浏览器上下文中评估 javascript,因此如果它在计时器上,您可以更快地启动您的 ajax 代码,并且您不想等待它。

看着browser.evaluate(expr)

另一种选择是简单地使用正常的 JavaScript 超时来等待 20 秒,然后查看 DOM 中是否有您期望的更改。

setTimeout(function(){
  browser.document.query("#interestingElement")
}, 20*1000);
Run Code Online (Sandbox Code Playgroud)