2014-10-19 369 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

相關問題