如何使用Intern在功能测试期间报告JavaScript错误?

时间:2014-07-26 00:56:59

标签: javascript selenium intern saucelabs

如何使用Intern报告在测试执行期间发生的JavaScript错误?基本上,如果页面上有任何JavaScript错误(即使是未明确测试的部分内容),我想知道。

背景

我刚刚开始使用Intern并进行测试,我正试图在所有浏览器中测试我网站上的所有主要页面,因为我只是通过require.js更改了所有JavaScript。虽然它在Chrome中看起来不错,但过去我遇到过require.js和随机浏览器的问题,所以我想自动化一切。最可能出现的问题是,由于异步加载和预期全局的加载,某些随机JS将无法执行。由于目前没有设置测试,我基本上想要开始运行'测试'来浏览所有主要页面并报告任何JavaScript错误。

1 个答案:

答案 0 :(得分:3)

为了报告未捕获的错误,您需要挂钩页面的window.onerror方法。这是可能的,但是在添加挂钩之前需要完成页面加载,这意味着在页面加载之前/期间发生的任何错误(或在页面卸载时发生的错误)都无法捕获和报告。这也意味着如果您执行移动到新页面的操作(如表单提交),则需要确保在执行导致导航的操作之前检索错误列表,并重新配置window.onerror到达新页面后的处理程序。

要通过功能测试执行此类报告,您的测试最终会看起来像这样:

return this.remote
  .get('http://example.com')
  .execute(function () {
    window.__internErrors__ = [];
    window.onerror = function () {
      __internErrors__.push(Array.prototype.slice.call(arguments, 0));
    };
  })
  // ... interact with the page ...
  .execute(function () {
    return window.__internErrors__;
  })
  .then(function (errors) {
    // read `errors` array to get list of errors
  });

请注意(截至2014年8月)所有浏览器中window.onerror的错误除了最近版本的Chrome之外,仅提供消息,脚本来源,行号和(有时)列号,因此此信息仅为有用的说“此操作导致错误,请手动执行以获取堆栈跟踪”。

在单元测试期间,Intern已经尝试自动捕获任何未处理的错误,并将它们视为停止系统的致命错误(因为您永远不会有生成此类未处理错误的代码)。