【问题标题】:Capturing JS errors in Chrome在 Chrome 中捕获 JS 错误
【发布时间】:2013-04-02 22:39:33
【问题描述】:

我正在使用window.onerror 捕获应用程序中的 js 错误,但问题是 - 在 Chrome 中,如果未打开开发工具 - 那么传递给 onerror 处理程序的 url 参数始终等于打开的 url .

如果打开了开发工具,则 url 指向导致 js 错误的确切 .js 文件。

你是怎么处理的?有什么解决方法吗?

更清楚一点 - 这里有 2 个结果:

  1. Uncaught ReferenceError: a is not defined index:122 - 这是在获取页面后收到的
  2. Uncaught ReferenceError: a is not defined List.js:122 - 这是在打开开发工具的情况下获取同一页面后收到的。这是预期结果 - 我已将 a(); 调用放入 List.js 文件进行测试。

UPD:这是为功能测试(使用 selenium webdriver)而完成的 - 我想捕获 js 错误以供进一步调查。

【问题讨论】:

  • 如果您正在寻找需要修复的异常,我会说打开开发工具的“源”选项卡,然后使用左下角的“暂停所有/未捕获的异常”的面板。
  • @Fabrício Matté:它用于功能测试 - 我想捕获 js 错误以进行进一步调查。对不起,我一开始没有提到它

标签: javascript google-chrome testing selenium selenium-webdriver


【解决方案1】:

更多尝试确实可以回答,但它可能会有所帮助。

Chrome 最近将 chrome://inspect/ 添加到了方便的 URL 列表中(完整列表请参见 chrome://chrome-urls/)。不幸的是,我找不到我读到的关于此的推文或博客文章,但我认为它是在上个月内。该 URL 肯定适用于 Chrome 28。

chrome://inspect/ 列出所有打开的选项卡,并带有一个 inspect 链接,该链接重定向回现有的打开页面,但也会打开 DevTools。

我认为 selenium 测试可以在一个选项卡中打开被测站点,然后在第二个选项卡中打开 inspect 页面,按照inspect 链接返回测试页面,但这DevTools 打开的时间,允许window.onerror 捕获更好的错误。

类似:

document.getElementsByClassName('row')[n].getElementsByTagName('a')[0].click()

【讨论】:

  • “然后在第二个选项卡中打开检查页面”——我不确定,但如果可以的话——那么这可能是一个解决方案,谢谢 :-)
【解决方案2】:

让我们提出以下架构:

window.addEventListener("error", handleException, false);

function handleException(I_sMsg) {

    if (I_sMsg.stack) {
            sMsg = I_sMsg.stack.replaceAll(getBaseURL(), "");
        alert(sMsg);
    } else if (I_sMsg.message) {
        alert(I_sMsg.message);
    }   

    return cancelEvent(I_sMsg);
} 

现在任何throw new Error("description"); 都将通过 if 语句的第一部分,并有一个很好的堆栈供您使用 url 解析。

它也适用于意外异常,因此会出现以下消息(在这种情况下,在调用不存在的 bibi() 函数之后)

经过进一步调查,我的框架正在使用某种自制的作业管理(实际上如堆栈中所示),其中每个操作都属于一个作业。

作业执行方式如下(简化)

    try {
        oTask.func.apply(oTask.obj, oTask.prms);
    } catch(ex) {
        handleException(ex);
        return false;
    }

所以这意味着每一次执行都被封装在这个单一的 try catch 块中。如您所见,exception 被捕获,并传递给处理程序。不是错误

我虽然它在另一个文件中工作,但这是因为调用被封装,而直接在 api.js 文件中它是一个不受框架管理的免费调用。

【讨论】:

  • 这实际上不是关于应用程序级别的错误处理,而是关于意外的 js 错误,例如调用非函数或访问未定义变量的属性。
  • 是的,它也可以。我将在 2 分钟内添加截图
  • 那会很好,因为对于我的例子来说,调用不存在的a() 函数它没有提供任何新的东西
  • 已编辑。请注意,您看不到完整的 URL,因为我使用的 handleException 会截断它。但是你有完整的 URI,我相信你要求的。
  • 是的,对于异步操作,我还创建了一个特定的管理器来处理这种情况。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 2018-06-16
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多