【问题标题】:Grab JavaScript console output with PhantomJS and evaluate it使用 PhantomJS 获取 JavaScript 控制台输出并对其进行评估
【发布时间】:2016-04-07 04:29:30
【问题描述】:

我正在尝试解析路由器的状态页面以获取 wlan 设备的数量。该页面使用一些 JavaScript 来获取状态,所以我尝试使用 PhantomJS,但没有成功。

这是状态页面的html源(status.html和status.js):http://pastebin.com/dmvptBqv

我的浏览器的开发者工具在控制台上显示这个输出(匿名):

([ {"vartype":"value","varid":"device_name","varvalue":"Speedport W 921V"}, {"vartype":"value","varid":"factorydefault","varvalue":"1"}, {"vartype":"value","varid":"rebooting","varvalue":"0"}, {"vartype":"value","varid":"router_state","varvalue":"OK"}, {"vartype":"value","varid":"bngscrat","varvalue":"0"}, {"vartype":"value","varid":"acsreach","varvalue":"0"},

Full reference

我怎样才能从 PhantomJS 中得到这个评估的输出?也许它很简单,我只是错过了文档中的部分。

我认为我必须使用评估函数,但不知道文档对象返回完整评估的正确函数是什么。

var webPage = require('webpage');
var page = webPage.create();

page.open('blubb', function   (status) {

  var js= page.evaluate(function() {
    return document.???;
  });

  console.log(js);
  phantom.exit();

});

【问题讨论】:

  • 您是否尝试注册到page.onConsoleMessage
  • 您好,我尝试了page.onConsoleMessage = function(msg) { console.log('CONSOLE: ' + msg); };,控制台日志为document.body.innerHTML;,但没有成功。
  • 如果您说开发人员工具已经在控制台中显示了某些内容,那是没有意义的。 page.open(url, function (status) { console.log("test"); phantom.exit(); }); 是否打印任何内容?如果是这样,page.open(url, function (status) { console.log(page.content); phantom.exit(); }); 呢?
  • 嗨,第一个给我$ ./phantomjs test.js > test。后者打印了html源码,但是javscript没有被执行,看这里:link
  • a) status 说什么? b)您使用哪个 PhantomJS 版本? c) 请注册onConsoleMessageonErroronResourceErroronResourceTimeout 活动 (Example)。也许有错误。 d) 在打印页面源/渲染屏幕截图之前,您是否尝试过稍等片刻?

标签: javascript phantomjs


【解决方案1】:

您遇到的主要问题是将控制台消息从页面获取到一个可以进行进一步处理的单一结构中。这可以通过以下代码轻松完成,该代码无限期地等待直到出现第一条控制台消息,并在 1 秒内没有出现更多消息时立即停止等待。

var logs = []
    timeoutID;

page.onConsoleMessage = function(msg){
    if (timeoutID) clearTimeout(timeoutID);

    logs.push(msg); // possibly also further processing
    timeoutID = setTimeout(function(){
        page.onConsoleMessage = function(msg){
            console.log("CONSOLE: " + msg);
        };

        // TODO: further processing
        console.log(JSON.stringify(logs, undefined, 4));
        phantom.exit();
    }, 1000);
};

page.open(url); // wait indefinitely

如果每个msg 都是有效的 JSON,那么您可以立即对其进行解析以获取 JavaScript 对象。改变

logs.push(msg);

logs.push(JSON.parse(msg));

【讨论】:

    猜你喜欢
    • 2016-12-23
    • 2021-09-13
    • 2016-06-21
    • 1970-01-01
    • 2020-06-11
    • 2021-07-31
    相关资源
    最近更新 更多