【问题标题】:How to report JavaScript errors during functional tests using Intern?如何在使用 Intern 进行功能测试期间报告 JavaScript 错误?
【发布时间】:2014-09-17 22:38:27
【问题描述】:

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

背景

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

【问题讨论】:

    标签: javascript selenium intern saucelabs


    【解决方案1】:

    为了报告未捕获的错误,您需要挂钩页面的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 已经尝试自动捕获任何未处理的错误并将它们视为导致系统停止的致命错误(因为您永远不应该有代码会生成这种未处理的错误)。

    【讨论】:

    • 感谢 @CSnover 以及您在 Intern 和 TraceKit 等方面所做的出色工作。我一直在使用getLogsFor('browser'),但后来我意识到并非所有浏览器都支持它。这听起来像是一个更好的解决方案,也许我可以让页面在测试期间将此代码添加到 中以捕获所有错误。
    • 在 chrome 中检索堆栈:blog.bugsnag.com/js-stacktraces (section: the Good)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    相关资源
    最近更新 更多