2014-10-19 21 views
6

Bir web sayfam Ekran görüntüsüne PhantomJS kullanıyorum. Bununla birlikte, kütüphane, bazı manipülasyonlara izin vermek için, sayfa DOM'deki jQuery işlevselliğini enjekte etmek için barındırılan bir jQuery dosyasına çağrı yapar. Burada Görülme: http://phantomjs.org/api/webpage/method/include-js.htmlPhantomjs, page.includeJs ile yerel bir dosya kullanıyor?

kod şuna benzer:

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

I (a) yavaş ve (b) güvenilir değil çünkü JS için harici bir çağrı yapmak istemiyoruz. Ben yerel bir kopyasını kullanmak istiyorum ve o şekilde o yolu ayarlayın ama yüklenirken DEĞİLDİR.

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

Burada sorun nedir? Yolum neden beklediğim gibi çalışmıyor? Bu işlev page.includeJs göreceli yollara izin vermiyor mu?

cevap

3

belgelerine göre bu fonksiyon barındırılan sayfasından erişilebilir olması gerekir belirli bir URL komut dosyası içeriyor. Yerel yolun uzak ana makinede (göreceli ya da mutlak) erişilememesi nedeniyle, betiği bunun yerine injectJs ile enjekte etmeniz gerekir.

Düzenleme:

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(); 
}); 


ekstra kodu da jquery aynı şekilde enjekte edilebilir ve kesin çalışacaktır: İşte testi için kullanılan koddur. yaklaşık evaluate() sınırlamaları hatırla (ama bu durumda gerçekten büyük bir anlaşma değil):

Not: argümanlar ve dönüş değeri basit ilkel nesne olmalıdır fonksiyonunu değerlendirmek. Başparmak kuralı: JSON üzerinden serileştirilmiş olabilirse, o zaman iyi olur.

Kapaklar, fonksiyonlar, DOM düğümleri, vb çalışmaz!


Düzenleme: Ayrıca filepath sorun hakkında: check what is your working directory. Göreli yollar kullanmak zor olabilir, bu yüzden mutlak kullanmanızı öneririm. Tek ihtiyacınız olan webpage.libraryPath. Umarım şimdi sana yardım ettim. Çok

+0

çalıştı injectJs. Yol da çözülmez. Dokümanları okumaktan çok ince farklılıkları olduğunu düşünüyorum. – fyz

+0

@fab Evet, bazı farklılıklar var, ancak yerel komut dosyasını çalıştırmanın tek yolu. Muhtemelen yanlış dosya yolu sağlıyorsunuzdur. Mutlak olanı kullanmayı deneyin ve işe yarayıp yaramadığını görün. – ghost

+0

BTW 'injectJs' doğru DOKÜMANLAR değildir: "Not: argümanları ve değerlendirmek işlevine geri dönüş değeri, basit bir ilkel nesne olmalıdır başparmak kuralı. JSON ile serileştirilebilir, o zaman iyi . Kapanışlar, fonksiyonlar, DOM düğümleri, vb çalışmayacak! " http://phantomjs.org/api/webpage/method/inject-js.html – fyz