使用PhantomJS获取JavaScript控制台输出并对其进行评估

时间:2016-01-03 11:55:00

标签: javascript phantomjs

我试图解析路由器的状态页面以获取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中获取此评估输出?也许这很简单,我只是错过了文档中的部分。

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

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();

});

1 个答案:

答案 0 :(得分:0)

您遇到的主要问题是将来自页面的控制台消息转换为可以进行进一步处理的单个结构。使用以下代码可以轻松完成此操作,该代码会在第一个控制台消息出现之前无限期等待,并在1秒钟内没有其他消息出现时立即停止等待。

var c = canvas.getElement();
var w = c.width, h = c.height;
c.setAttribute('width', w * window.devicePixelRatio);
c.setAttribute('height', h * window.devicePixelRatio);
c.getContext('2d').scale(window.devicePixelRatio, window.devicePixelRatio);

如果每个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 都是有效的JSON,那么您可以立即解析它以获取JavaScript对象。变化

msg

logs.push(msg);