2014-10-19 20 views
6

我正在使用PhantomJS来截图网页。然而,该库调用托管的jQuery文件在页面DOM中注入jQuery功能以允许进行一些操作。在这里看到:http://phantomjs.org/api/webpage/method/include-js.htmlPhantomjs与page.includeJs一起使用本地文件?

的代码看起来是这样的:

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不允许相对路径吗?

回答

3

根据文档,此功能包括来自给定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是你所需要的。我希望我现在能帮到你。

+0

也尝试过injectJs。路径也没有解决。从阅读文档我认为他们也有微妙的差异。 – fyz 2014-10-20 00:36:36

+0

@fab是的,有一些差异,但它是运行本地脚本的唯一方法。您可能提供了错误的文件路径。尝试使用绝对的一个,看看它是否工作。 – ghost 2014-10-20 00:55:06

+0

Btw'injectJs'不正确DOCS:“注意:参数和评估函数的返回值必须是一个简单的原始对象,经验法则:如果它可以通过JSON序列化,那么它就没有问题 闭包,函数,DOM节点等不起作用!“请参阅链接:http://phantomjs.org/api/webpage/method/inject-js.html – fyz 2014-10-20 03:52:12

相关问题