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

Jam*_*yke 12 javascript webkit phantomjs

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

我需要的是捕获或以其他方式区分这些错误的方法.我已经尝试过了:

  • 将我的PhantomJS脚本包装在try-catch中
    • 结果:没有任何东西被抛到足以被这个抓住
  • 定义一个window.onerror函数
    • 结果:没有任何反应.WebKit没有在窗口上实现onerror事件

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

Jul*_* D. 8

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

但是,您应该能够捕获代码中抛出的异常.如果您正在使用类似于webPage.evaluate(...)运行代码的内容,则无法将完整调用包装在try/catch块中,因为脚本在不同的上下文中进行评估,并且错误不会出现在主执行上下文中.相反,您需要捕获页面执行上下文中的错误.遗憾的是,无法访问主上下文中定义的任何函数,因此我们必须在代码周围显式编写包装代码以执行.

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

...

// 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
                // ...
            }

            ...

        });
    }
});

...
Run Code Online (Sandbox Code Playgroud)