在 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>
script:broken.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.
答案 0 :(得分:0)
您可能在测试设置中遗漏了一些内容,但一切正常。您可能忘记了phantomJS调用是异步的。
以下是我的测试设置:
<强>的test.html 强>
<!docType>
<html><head></head>
<body>
<script src='broken.js'></script>
</body>
</html>
<强> broken.js 强>
var i = 20;
i = somethingThatDontExist;
<强> testError.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()});
答案 1 :(得分:0)
这是一个老问题,但仍然是一个问题(我最近碰到了这个问题)。 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
回调将获取消息的字符串和字符串&#34; [object Object]&# 34; ...所以关于该对象中包含的错误的任何数据在页面上下文和幻像之间都会丢失。
(console.error
可能与console.log
的行为不同,但我没有对其进行测试。)
3)page.onError
目前在phantomjs 2.5.0中被打破。永远不会调用它,而是在page.onConsoleMessage
中显示错误,但错过了错误对象(参见#2)。
如果你真的需要知道页面上是否有javascript错误,请立即使用phantomjs 2.1.1。
请参阅以下有关重复代码的错误,该代码说明了page.onError
,page.onResourceError
和page.onConsoleMessage
时2.1.1和2.5.0之间的差异。