4

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>

脚本:break.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. 
4

2 回答 2

0

您可能错过了测试设置中的某些内容,但一切正常。你可能忘记了 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()});
于 2015-01-03T21:08:13.423 回答
0

这是一个老问题,但仍然是一个问题(我最近遇到了这个问题)。OP 可能使用的是旧版本。

有几件事要检查...

1) console.logphantomjs 2.1.1 和 2.5.0 之间的 API 发生了变化。在 2.5.0console.log中只打印第一个参数(在 2.1.1 中它将打印全部)。

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

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

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

例如,如果(在页面中)一个 javascript catchblock 执行了console.log('message', error),则 phantomjspage.onConsoleMessage回调将获取消息的字符串和字符串“[object Object]”...因此,该对象中包含的有关错误的任何数据都会在页面上下文和 phantomjs。

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

3)page.onError目前在 phantomjs 2.5.0 中被破坏。它永远不会被调用,而是出现错误page.onConsoleMessage但错过了错误对象(参见#2)。

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

请参阅下面的错误以获取说明 2.1.1 和 2.5.0 之间在page.onError,page.onResourceErrorpage.onConsoleMessage.

https://github.com/ariya/phantomjs/issues/14776

于 2017-02-25T18:27:26.340 回答