在phantomjs的文档中,他们说:
错误处理为了轻松捕获网页中发生的错误,无论是语法错误还是其他引发的异常,都添加了 WebPage 对象的 onError 处理程序。此类处理程序的示例如下:
page.onError = function (msg, trace) {
console.log(msg);
trace.forEach(function(item) {
console.log(' ', item.file, ':', item.line);
})
}
现在,如果页面打开一个包含一些 JavaScript 异常的站点,则会打印出详细信息(包括堆栈跟踪)。
好吧,我已经创建了一些"损坏"的页面(javascript导致异常的页面),我得到了引发但跟踪中没有任何内容的错误
有人可以帮忙吗?
以下是我遇到的一个案例示例:
.html:
<!docType>
<html><head></head>
<body>
<script src='broken.js'></script>
</body>
</html>
脚本:坏了.js
1. // this script is broken at line 5.
2. //
3. var i=20;
4.
5. i = somethingThatDontExist
6.
7. // we will never be here...
8.
您可能在测试设置中遗漏了一些内容,但一切正常。您可能忘记了phantomJS调用是异步的。
这是我的测试设置:
测试.html
<!docType>
<html><head></head>
<body>
<script src='broken.js'></script>
</body>
</html>
坏了.js
var i = 20;
i = somethingThatDontExist;
测试错误.js
var page = require('webpage').create();
page.onError = function (msg, trace) {
console.log(msg);
trace.forEach(function(item) {
console.log(' ', item.file, ':', item.line);
})
}
page.open('test.html',function(){phantom.exit()});
老问题,但仍然是一个问题(我最近遇到了这个问题)。 OP 可能使用的是旧版本。
需要检查的几件事...
1) 用于console.log
的 API 在 phantomjs 2.1.1 和 2.5.0 之间发生了变化。 在 2.5.0 中,console.log
只打印第一个参数(在 2.1.1 中,它将打印所有参数)。
为了安全起见,首先尝试构建一个字符串并将其记录为单个参数,以确保这不仅仅是一个日志记录问题。 即console.log(concatenatedString)
不console.log(var1, var2, var3,...)
如果要连接对象和数组,请使用 JSON.stringify(object)
。
2)根据我的经验,phantomjs在如何捕获页面上下文中的错误方面不一致。
例如,如果(在页面中)一个javascript catchblock执行console.log('message', error)
,phantomjs page.onConsoleMessage
回调将获得消息的字符串和一个字符串"[对象对象]"...因此,有关该对象中包含的错误的任何数据都会在页面上下文和 PhantomJS 之间丢失。
(console.error
可能与console.log
有不同的行为,但我没有测试它。
3)目前page.onError
在Phantomjs 2.5.0中被破坏了。 它永远不会被调用,而是错误显示在page.onConsoleMessage
中,但错过了错误对象(参见#2)。
现在使用 phantomjs 2.1.1 如果你真的需要知道页面上是否有 javascript 错误。
请参阅下面的错误以获取重现代码,该代码说明了 2.1.1 和 2.5.0 在 page.onError
、page.onResourceError
和 page.onConsoleMessage
方面的差异。
https://github.com/ariya/phantomjs/issues/14776