捕获Chrome中的JS错误

时间:2013-04-10 21:35:39

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

我使用window.onerror在应用程序中捕获js错误,但问题是 - 如果未打开dev工具,则在Chrome中 - 然后将url参数传递给onerror处理程序总是等于打开的网址。

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

你是如何处理的?有没有解决方法?

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

  1. Uncaught ReferenceError: a is not defined index:122 - 这是在抓取页面后收到的
  2. Uncaught ReferenceError: a is not defined List.js:122 - 在打开dev工具获取同一页面后收到此消息。这是预期的结果 - 我已将a();调用List.js文件进行测试。
  3. UPD :这是为了进行功能测试(使用selenium webdriver) - 我想捕获js错误以供进一步调查。

2 个答案:

答案 0 :(得分:1)

更多尝试的答案真的可以回答。但

Chrome最近将chrome://inspect/添加到了便捷的网址列表中(有关完整列表,请参阅chrome://chrome-urls/)。我遗憾地找不到关于此的推文或博客文章,但我认为这是在上个月内。该网址肯定适用于Chrome 28。

chrome://inspect/列出所有打开的标签,其中包含检查链接,该链接会重定向回现有的打开页面,但也会打开DevTools。

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

类似的东西:

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

答案 1 :(得分:1)

让我们提出以下架构:

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语句的第一部分,并且有一个很好的堆栈供你用网址解析。

它也适用于意外的异常,因此产生以下消息(在这种情况下,在调用未发送的bibi()函数之后)

screenshot of an unexpected exception

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

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

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

因此,这意味着每个执行都封装在这个try catch块中。如您所见,捕获了异常,并将其传递给处理程序。不是错误

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