javascript - 无法将 phantom.exit() 放入 page.evaluate() 中的 phantomjs

标签 javascript callback phantomjs

我有 2 个代码示例如下:

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: Can't find variable: 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'。

=> 以上两种方式都不能打印出'here'。有什么有效的方法可以无误地打印“这里”吗?

最佳答案

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

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

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

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

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

关于javascript - 无法将 phantom.exit() 放入 page.evaluate() 中的 phantomjs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33570915/

相关文章:

javascript - 如何将一个对象json转换为数组对象json?

javascript - 如何将 Action 从 Ember 组件发送到包装它的 View ?

javascript - 您可以在 JavaScript 中将对象方法作为回调传递吗?

python - 使用 Python unittest 测试回调调用的正确方法是什么?

node.js - 如何将静态文件预加载或安装到 Highchart 的导出服务器中?

Javascript:用标签包装匹配的正则表达式

javascript - 单击按钮时评估用户 JS 语法

rust - 如何将引用参数传递给盒装闭包?

javascript - 为什么 PhantomJS 会调用两次 onResourceReceived ?

javascript - casperjs 在 Windows 机器上无法按预期工作