无法将phantom.exit()放入phantomjs中的page.eevaluate()中

Cannot put phantom.exit() inside page.evaluate() in phantomjs

本文关键字:中的 page eevaluate phantomjs 放入 phantom exit      更新时间:2023-09-26

我有两个代码示例,如下所示:

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.eevaluate()中,出现错误:"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.eevaluate()之外。没有错误,但"here"没有打印出来。

=>以上两种方式都无法打印出"此处"。有没有什么有效的方法可以在没有错误的情况下打印"这里"?

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

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

您需要等待page.evaluate回调到phantom脚本,然后从那里调用exit。Phantom文档显示了这种确切的情况,在evaluate返回后调用exit。它们似乎没有涵盖evaluate是否阻塞,但这个例子表明它可能是。

要从页面捕获日志消息,您需要订阅其onConsoleMessage事件。Phantom控制台只从正在运行的脚本中接收消息,而不会接收可能加载的任何页面。您所需要做的就是将页面消息路由到幻影控制台:

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

尝试返回所需的数据,并在评估后执行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()
  });
});