Javascript 在Chrome中捕获JS错误
我用Javascript 在Chrome中捕获JS错误,javascript,google-chrome,testing,selenium,selenium-webdriver,Javascript,Google Chrome,Testing,Selenium,Selenium Webdriver,我用window.onerror捕获应用程序中的js错误,但问题是-在Chrome中,如果没有打开开发工具-那么传递给onerror处理程序的url参数始终等于打开的url 如果dev tools已打开,则url指向导致js错误的确切.js文件 你是怎么处理的?有什么解决办法吗 更清楚地说,这里有两个结果: 未捕获引用错误:未定义索引:122-这是在获取页面后收到的 uncaughtreferenceerror:a未定义列表。js:122-这是在获取打开开发工具的同一页面后收到的。这是一个预期的
window.onerror
捕获应用程序中的js错误,但问题是-在Chrome中,如果没有打开开发工具-那么传递给onerror
处理程序的url
参数始终等于打开的url
如果dev tools已打开,则url
指向导致js错误的确切.js
文件
你是怎么处理的?有什么解决办法吗
更清楚地说,这里有两个结果:
未捕获引用错误:未定义索引:122
-这是在获取页面后收到的uncaughtreferenceerror:a未定义列表。js:122
-这是在获取打开开发工具的同一页面后收到的。这是一个预期的结果-我已经把a()
调用List.js
文件进行测试chrome://chrome-urls/
查看完整列表)。不幸的是,我找不到我读到的关于此事的推特或博客帖子,但我认为这是在上个月。这个URL在Chrome 28上确实有效
chrome://inspect/
列出所有打开的选项卡,其中包含检查链接,该链接重定向回现有打开的页面,但也会打开DevTools
我认为selenium测试可以在一个选项卡中打开被测站点,在第二个选项卡中打开inspect页面,按照
inspect
链接返回测试页面,但这次打开的是DevTools,允许window.OneError
捕获更好的错误
比如:
document.getElementsByClassName('row')[n].getElementsByTagName('a')[0].click()
让我们提出以下架构:
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);
}
现在任何抛出新错误(“说明”)
将遍历if语句的第一部分,并有一个很好的堆栈供您使用URL进行解析
它也适用于意外的异常,因此会产生以下消息(在本例中,在调用不存在的bibi()
函数之后)
经过进一步调查,我的框架使用某种自制的作业管理(如堆栈中实际显示的),其中每个操作都属于一个作业
作业执行方法如下(简化)
这意味着每一次执行都封装在这个try-catch块中。如您所见,异常被捕获,并传递给处理程序。不是错误
我认为它在另一个文件中工作,但这是因为调用是封装的,而在api.js文件中,它是一个不受框架管理的免费调用。如果您要查找需要修复的异常,我建议打开开发工具的“源”选项卡,然后使用“暂停所有/未捕获异常”在面板的左下角。@Fabricio Matté:这是用于功能测试的-我想捕获js错误以供进一步调查。很抱歉,我没有一开始就提到它。它实际上不是关于应用程序级别的错误处理,而是关于意外的js错误,例如调用非函数或访问未定义变量的属性。是的,它也可以工作。我将在2分钟内添加一个屏幕截图,这很好,因为在我调用不存在的
a()
函数的示例中,它不会提供任何新编辑的内容。请注意,您没有看到完整的URL,因为我使用的handleException会截断它。但是您有完整的URI,我相信这是您要求的。是的,对于异步操作,我还制作了一个特定的管理器来处理这种情况。;)“然后在第二个选项卡中打开检查页面”--我不确定,但如果可以-那么这可能是一个解决方案,谢谢:-)
try {
oTask.func.apply(oTask.obj, oTask.prms);
} catch(ex) {
handleException(ex);
return false;
}