不能将phantom.exit()放在phantomjs中的page.evaluate()中

时间:2015-11-06 16:08:19

标签: javascript callback phantomjs

我有两个代码示例如下:

var page = require('webpage').create();
page.open('https://www.youtube.com', function(s) {
  console.log(s);
  page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
    var t = page.evaluate(function() {
      console.log('here');
       phantom.exit();     // case 1: inside page.evaluate()
    });

  });
});

- >在这种情况下,phantom.exit()放在page.evaluate()中,并出现错误:" ReferenceError:找不到变量:phantom"

var page = require('webpage').create();
page.open('https://www.youtube.com', function(s) {
  console.log(s);
  page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
    var t = page.evaluate(function() {
      console.log('here');
    });
    phantom.exit();            // case 2: outside page.evaluate()
  });
});

- >在案例2中:将phantom.exit()放在page.evaluate()之外。没有错误,但是在这里'没有打印出来。

=>以上两种方式都不能打印出来这里'。是否有任何有效的方式来打印' here'没有错误?

2 个答案:

答案 0 :(得分:4)

您不能在页面内部使用任何phantom方法,就像页面本身无法使用它们一样。

phantom对象是运行时提供给它最初启动的脚本的特殊主机对象。加载页面后,页面将在其自己的上下文中使用通常的浏览器变量运行,这些变量不包括phantom

您需要等待page.evaluate回复虚拟脚本,然后从那里调用exit。幻影docs show this exact case,在exit返回后调用evaluate。它们似乎没有涵盖evaluate是否阻挡,但是示例表明它可能是阻塞的。

要从页面捕获日志消息,您需要订阅其onConsoleMessage event。 Phantom控制台仅从正在运行的脚本中获取消息,而不是从可能加载的任何页面中获取消息。您需要做的就是将页面消息路由到幻像控制台:

page.onConsoleMessage = function(msg) {
  console.log('PAGE: ' + msg);
};

答案 1 :(得分:-1)

尝试返回所需的数据并在评估后执行console.log()

实施例

var page = require('webpage').create();
page.open('https://www.youtube.com', function(s) {
console.log(s);
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
var t = page.evaluate(function() {
  return "here";
});
console.log(t);
phantom.exit();            // case 2: outside page.evaluate()
  });
});