javascript - 如何捕获 PhantomJS 获取的页面中生成的 JavaScript 错误?

标签 javascript webkit phantomjs

我有一个加载本地 HTML 文件的 PhantomJS 脚本,注入(inject)一些 javascript 文件,然后在页面上下文中执行一些 javascript。运行的 javascript 生成异常,但我只从控制台获得输出,它似乎没有区分错误和正常日志,并且没有文件、行号或堆栈跟踪。

我需要的是一种捕获或区分这些错误的方法。我已经试过了:

  • 在 try-catch 中包装我的 PhantomJS 脚本
    • 结果:没有东西被抛得足够远而被它捕获
  • 定义一个window.onerror函数
    • 结果:没有任何反应。 WebKit 没有在窗口上实现 onerror 事件

我希望能够检索错误对象本身,以便检索堆栈跟踪。

最佳答案

我认为 window.onerror 在 WebKit 中无法正常工作存在问题 (https://bugs.webkit.org/show_bug.cgi?id=8519)。不知道这个问题是否已得到修复,如果已修复,QT WebKit 版本是否已经是最新的。

但是,您应该能够捕获代码中抛出的异常。如果您使用类似 webPage.evaluate(...) 的方法来运行您的代码,您不能将完整的调用包装在 try/catch block 中,因为脚本是在不同的上下文中评估的,并且错误不会出现在主执行上下文中。相反,您需要在页面执行上下文中捕获错误。不幸的是,无法访问主上下文中定义的任何函数,因此我们必须明确地围绕要执行的代码编写包装代码。

以下是 PhantomJS 源代码中包含的 phantomwebintro.js 文件的修改示例。它加载一个 HTML 页面,插入一个脚本,然后在页面上下文中运行一些代码(这里有一行抛出类型错误)。此代码用 try/catch block 包装,并将包装的结果或错误对象返回到主上下文。

...

// Load an HTML page:
page.open("http://www.phantomjs.org", function(status) {
    if (status == "success") {

        // Inject some scripts:
        page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {

            // Run your own code in the loaded page context:
            var resultWrapper = page.evaluate(function() {
                var wrapper = {};
                try {
                    // Your code goes here
                    // ...

                    var x = undefined.x; // force an error

                    // store your return values in the wrapper
                    wrapper.result = 42;
                } catch(error) {
                    wrapper.error = error;
                }
                return wrapper;
            });

            // Handle the result and possible errors:
            if (resultWrapper.error) {
                var error = resultWrapper.error;
                console.log("An error occurred: " + error.message);
                // continue handling the error
                // ...
            } else {
                var result = resultWrapper.result;
                // continue using the returned result
                // ...
            }

            ...

        });
    }
});

...

关于javascript - 如何捕获 PhantomJS 获取的页面中生成的 JavaScript 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7502899/

相关文章:

javascript - JavaScript 中 JSON 时间值的排列

javascript - Laravel 路由在 API 中不起作用,返回页面 404

google-chrome - css3边框半径不适用于子元素

jquery - 复杂的 Webkit 错误?相对位置 + Z-Index + 溢出隐藏 + CSS3 变换

javascript - 如何在casperjs中导入其他js文件

javascript - 如何将 log4javascript 与 ScalaJS/PhantomJS 一起使用

javascript - stats.nba.com 的 CORS/CORB

javascript - 如何将一个值发布到 WebService 中并解析另一个值?超文本标记语言

Webkit 忽略包含行框的内联 block 的垂直对齐

javascript - 在node.js中使用phantom.js生成PDF