在PhantomJS中,为什么jQuery调用导致脚本挂起?

时间:2015-09-14 14:32:02

标签: javascript jquery phantomjs

我在Mac OS X Yosemite上使用PhantomJS 2.0.0:

$ phantomjs --version
2.0.0

我的脚本(如下所示)似乎挂在调用$('h1').size()的行:

system = require('system');

function usage() {
  console.log("usage: phantomjs " + system.args[0] + " <url>");
  phantom.exit(1);
}

console.log("system.args.length=" + system.args.length);
if (system.args.length != 2) {
  console.log("usage bad....");
  usage();
} else {
  var url = system.args[1];
  var page = require('webpage').create();

  console.log("Opening page: " + url);
  page.open(url, function (status) {
      if (status !== "success") {
        console.log("Unable to access network");
      } else {
        console.log("Setting timeout...");
        window.setTimeout(function() {
          page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js", function() {
            console.log("Searching for Seawolf Calendar...");
            console.log("h1.size=" + $('h1').size());

            console.log("Exiting with status 0...");
            phantom.exit(0);
          });
        }, 5000);
      }
  });
}

从命令行调用脚本,例如:

phantomjs download-framed-content.js "http://www.sonoma.edu/calendar/groups/clubs.html"

输出如下:

system.args.length=2
Opening page: http://www.sonoma.edu/calendar/groups/clubs.html
Setting timeout...
Searching for Seawolf Calendar...

[Hung ...]

为什么jQuery调用挂起脚本?

1 个答案:

答案 0 :(得分:1)

PhantomJS 2.0.0由于某种原因没有显示任何错误(这是一个已知错误)。

错误是$不是函数。如果页面中存在jQuery,那么您可以在页面中使用它,但它不会在页面上下文之外工作(在page.evaluate()内)。

您只能通过page.evaluate()访问DOM /页面上下文:

console.log("h1.size=" + page.evaluate(function(){
    return $('h1').size();
}));

请注意,您不能在page.evaluate()内使用任何外部变量,因为它是沙箱。 documentation说:

  

注意: evaluate函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。

     

闭包,函数,DOM节点等将工作!