使用网桥时,PhantomJS page.evaluate返回undefined

时间:2014-10-24 05:05:50

标签: javascript meteor phantomjs

我正在尝试按照一些教程,一个简单的控制台日志来获取页面的标题,但是返回undefined,任何想法为什么会发生这种情况?

var phantom = Meteor.npmRequire('phantom');
phantom.create(function(ph){
  ph.createPage(function(page){
    page.open('http://m.bing.com', function(status) {
        var title = page.evaluate(function() {
            return document.title;
        });
        console.log(title);
        ph.exit();
    });
  });
});

2 个答案:

答案 0 :(得分:1)

看起来您正在使用PhantomJS和节点之间的phantomjs-node网桥。它的API与PhantomJS的不同之处在于,您调用/设置的每个函数或属性都会进行回调,结果准备就绪时page.evaluate也是如此。

GitHub上的README中的示例直接显示了您想要的代码:

phantom.create(function (ph) {
  ph.createPage(function (page) {
    page.open("http://www.google.com", function (status) {
      console.log("opened google? ", status);
      page.evaluate(function () { return document.title; }, function (result) {
        console.log('Page title is ' + result);
        ph.exit();
      });
    });
  });
});

答案 1 :(得分:0)

那是因为page.evaluate是异步的。也许尝试将其包装在Future - ized函数

var title = (function(page) {
    // not sure about Meteor.npmRequire... so I'm using Npm.require instead
    var Future = Npm.require('fibers/future'); 
    var future = new Future();

    page.evaluate(function() {
        future.return(document.title);
    });

    return future.wait();
})(page);
console.log(title);