Phantomjs使用带有page.includeJs的本地文件?

时间:2014-10-19 23:58:39

标签: javascript phantomjs

我正在使用PhantomJS来截取网页。但是,库调用托管的jQuery文件在页面DOM中注入jQuery功能以允许一些操作。见到这里:http://phantomjs.org/api/webpage/method/include-js.html

代码如下所示:

if ( loaded ) {
page.includeJs("http://code.jquery.com/jquery-1.8.3.min.js", 
  function() { . . .

我不想对JS进行外部调用,因为(a)它的速度较慢,(b)不可靠。我想使用本地副本,我设置了这样的路径,但它没有加载。

page.includeJs("assets/javascript/jquery.min.js",
  function() { . . .

这是什么问题?为什么我的道路不能像我期望的那样工作?这个函数page.includeJs不允许相对路径吗?

1 个答案:

答案 0 :(得分:4)

根据文档,此函数包含来自给定URL的脚本,该脚本需要可从托管页面访问。显然,远程主机上无法访问您的本地路径(相对或绝对),因此您需要使用injectJs注入脚本。

编辑:以下是我用于测试的代码:

var page = require('webpage').create();

page.open("http://ipecho.net/", function(status) {
    if ( status === "success" ) {
        if (page.injectJs("jquery.min.js")) {
            var h1 = page.evaluate(function() {
                return $("h1:eq(0)").css({fontSize: 10, color: "red"}).text();
            });
            console.log(h1);
        }
    }
    page.render("test.png");
    phantom.exit();
});


额外的代码也可以像jquery一样注入,并且肯定会起作用。请记住evaluate()限制(但在这种情况下,这并不是什么大问题):

  

注意: 评估函数的参数和返回值必须   是一个简单的原始对象。经验法则:如果可以的话   通过JSON序列化,然后就可以了。

     

闭包,函数,DOM节点等不起作用!


修改:还有关于您的文件路径问题:check what is your working directory。因此使用相对路径可能很棘手所以我建议你使用绝对路径。你只需要webpage.libraryPath。我希望我现在能帮到你。