【问题标题】:How to use browser.wait() in zombie.js?如何在zombie.js中使用browser.wait()?
【发布时间】:2013-03-08 04:36:45
【问题描述】:

我有一个 Web 应用程序,它使用 Ajax 请求不断地从服务器轮询数据。我想使用zombie.js对其进行集成测试。

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

但是,browser.wait() 总是几乎立即返回,即使我的 done 回调返回 false。

zombie API documentation,我读到了以下关于browser.wait()的内容:

...它不能永远等待,尤其是对于可能重复触发的计时器(例如检查页面状态、长轮询)。

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

【问题讨论】:

  • 你有什么新发现吗?
  • 只是为了确保:waitFor 使用毫秒,对吗?我说的是经验;)另外,不要忘记maxWait
  • “不断地从服务器轮询数据”——如果你对此有控制权,socket.io 将是一个很好的选择

标签: node.js zombie.js


【解决方案1】:

Zombie.js 默认会等到页面上的所有脚本都已加载并执行(如果它们正在等待文档准备好)。

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

browser.evaluate(expr)

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

setTimeout(function(){
  browser.document.query("#interestingElement")
}, 20*1000);

【讨论】:

  • 请注意:如果 Zombie 真的等到页面上的所有脚本都加载完毕,那就太好了,但据我在 stackoverflow.com/questions/37482891/… 上看到的,情况并非如此不幸的是,对于所有网站...
猜你喜欢
  • 1970-01-01
  • 2018-07-29
  • 2014-01-15
  • 2023-04-09
  • 2012-08-11
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2016-02-09
相关资源
最近更新 更多