【问题标题】:Zombie.js Error: Timeout: did not get to load all resources on this pageZombie.js 错误:超时:未加载此页面上的所有资源
【发布时间】:2017-10-22 20:59:43
【问题描述】:

我遇到了 Zombie.js 抛出错误 Error: Timeout: did not get to load all resources on this page 的问题。

它总是超级随机的,而且似乎总是发生在不同的测试中。

我曾经有以下代码行来防止这个问题。

Browser.waitDuration = '60s';

问题是最近 Stripe.js 导致了这个问题,我的单元测试需要额外的 55 秒。见this question

所以 Stripe 建议我删除那条线。果然我的测试又开始跑得更快了。

但我忘记了我添加了该行以防止出现此超时错误。

有什么想法可以解决这个问题,同时确保我的单元测试不会花费不合理的时间吗?

【问题讨论】:

  • 也许等待时间较短,捕捉错误并继续进行是一种选择?
  • @ippi 这究竟是如何工作的?如果测试失败,我不想继续并将测试标记为成功。我只是希望我的测试不要花整整一分钟,不要随机超时,而且似乎没有理由哈哈。
  • 是的,当然没有通过测试,但如果它每次都发生在不同的地方,也许这是可以接受的。即:使用zombie.on("error", callback) 捕获错误检查错误实际上是超时(如果不是超时则再次抛出),并可能记录一两行。
  • 我相信你现在已经看到了github.com/assaf/zombie/issues/882。谷歌分析似乎是一个恶棍,内存泄漏是另一个。 (抱歉,只是提出一些想法。)
  • @ippi 好的,这有点道理。我确实看到内存使用量超过 1.4gb 左右。我看不出它失败的时间和记忆之间有什么相似之处。就那个zombie.on错误而言,当它们不是并且可能记录一两行时再次抛出是什么意思?我的意思是我知道问题是超时。至少当测试失败时是这样说的。我只是不确定如何绕过它或解决问题。我确实认为 Stripe 最近集成了类似于 Google Analytics 的东西来查看页面上的时间(只是猜测,但似乎很有可能),这就是为什么它失败了。

标签: javascript node.js unit-testing mocha.js zombie.js


【解决方案1】:

我从未使用过 Zombie.JS,但我使用过很多 PhantomJS,并且遇到过类似的问题。我的解决方案是在测试期间阻止不必要的资源,从而将我的请求/响应时间减少到几毫秒(大部分时间)。

在另一个与zombie.js 相关的问题中有一个讨论,其中OP 想要阻止Google Analytics 等外部资源:

Prevent zombie.js from loading only external resources

提供了两个答案。第一个 - 选择的答案 - 与 3.1 之前的zombie.js 相关,第二个(非选择的答案)解释了如何使用“nock”npm 模块来存根外部资源。

抱歉,我没有时间制作任何示例。但是,我确实有一个在 PhantomJS 中阻塞资源的示例的要点:https://gist.github.com/mootzville/15af584e626b365d2664

也许这能给你一些想法。

祝你好运。

编辑(2017 年 6 月 3 日):

我玩弄了您在评论中提供的代码。下面是一些代码示例,应该适合您同时使用僵尸和诺克:

nock('https://js.stripe.com')
  .get('/v2')
  .replyWithFile(200, __dirname + '/stripev2.js');

var Browser = require('zombie');
var browser = new Browser();
var url = 'https://js.stripe.com/v2';


browser.fetch(url)
  .then(function(response) {
    console.log('Status code:', response.status);
    if (response.status === 200)
      return response.text();
  })
  .then(function(text) {
    console.log('Document:', text);
  })
  .catch(function(error) {
    console.log('Network error');
  });

澄清一下,stripev2.js 文件应该存在于本地与入口点相同的目录中——如果您遵循 Node 约定,那么它将是您的 app.js 或 index.js 文件所在的位置(通常,应用程序的根目录)。

【讨论】:

  • 刚开始尝试这个。我有以下代码nock('https://js.stripe.com/v2').log(console.log).get('/').replyWithFile(200, __dirname + 'stripev2.js');,我收到一条错误消息ReferenceError: window is not defined。不知道为什么会这样,因为它应该只是发送本地文件而不是发出网络请求。
  • @CharlieFish - 我想进一步帮助您,但目前没有时间深入研究更多代码;我已经埋葬在自己和他人之中。我建议您使用 PhantomJS。我知道这是一个新事物......但是一旦你掌握了它的窍门,你就可以做任何你想做的一切与浏览器测试/自动化相关的事情。
  • @CharlieFish - 请参阅我上面编辑中的代码。希望这对你有用。
猜你喜欢
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多