phantomjs-page.onError-trace始终是空对象吗?

phantomjs-page.onError-trace始终是空对象吗?,phantomjs,Phantomjs,在phantomjs的文档中,他们说: 错误处理 为了轻松捕获网页中发生的错误(无论是语法错误还是其他抛出的异常),已为网页对象添加了OneError处理程序。此类处理程序的一个示例是: 现在,如果页面打开一个包含一些JavaScript异常的站点,那么将打印出详细信息(包括堆栈跟踪) 好吧,我创建了一些“坏”页面(javascript导致异常的页面),我得到了 抛出的错误,但跟踪中没有任何内容 有人能帮忙吗 以下是我的一个案例: html: <!docType> <html&

在phantomjs的文档中,他们说:

错误处理 为了轻松捕获网页中发生的错误(无论是语法错误还是其他抛出的异常),已为网页对象添加了OneError处理程序。此类处理程序的一个示例是:

现在,如果页面打开一个包含一些JavaScript异常的站点,那么将打印出详细信息(包括堆栈跟踪)

好吧,我创建了一些“坏”页面(javascript导致异常的页面),我得到了 抛出的错误,但跟踪中没有任何内容

有人能帮忙吗

以下是我的一个案例:

html:

<!docType>
<html><head></head>
<body>
<script src='broken.js'></script> 
</body>
</html>

您可能错过了一些测试设置,但一切正常。您可能忘记了phantomJS调用是异步的

以下是我的测试设置:

test.html

<!docType>
<html><head></head>
  <body>
    <script src='broken.js'></script>
  </body>
</html>
testError.js

var i = 20;
i = somethingThatDontExist;
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)控制台.log的API在phantomjs 2.1.1和2.5.0之间发生了变化。在2.5.0
console.log中,只打印第一个参数(在2.1.1中,它将打印所有参数)。

为了安全起见,请尝试先构建一个字符串,并将其作为单个参数记录,以确保这不仅仅是一个日志记录问题。ie
console.log(concatenatedString)
not
console.log(var1,var2,var3,…)

如果要连接对象和数组,请使用
JSON.stringify(object)

2)根据我的经验,phantomjs在如何捕获页面上下文中的错误方面是不一致的。

例如,如果(在页面中)javascript catchblock执行
console.log('message',error)
,则phantomjs
page.onConsoleMessage
回调将获得消息字符串和字符串“[object object]”……因此,该对象中包含的有关错误的任何数据在页面上下文和phantomjs之间丢失

console.error
可能具有与
console.log
不同的行为,但我没有测试它。)

3)
page.onError
目前在phantomjs 2.5.0中被破坏。它从未被调用,相反,错误会显示在
页面中。OnConsolleMessage
但是错过了错误对象(请参见#2)。

如果您真的需要知道页面上是否存在javascript错误,请暂时使用phantomjs 2.1.1

请参阅下面的错误,了解说明2.1.1和2.5.0之间在
page.onError
page.onResourceError
page.onConsolleMessage
方面的差异的重新编译代码


你能提供一个可复制的测试用例吗?@AriyaHidayat是的,当然。我已经在我的查询中添加了。非常感谢您的参与。@Zo72您检查过我的答案了吗?
var i = 20;
i = somethingThatDontExist;
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()});