2014-10-19 8 views
6

Ich benutze PhantomJS um eine Webseite zu screenshot. Die Bibliothek ruft jedoch eine gehostete jQuery-Datei auf, um jQuery-Funktionalität in das Seiten-DOM zu injizieren, um einige Manipulationen zuzulassen. Gesehen hier: http://phantomjs.org/api/webpage/method/include-js.htmlPhantomjs verwendet eine lokale Datei mit page.includeJs?

Der Code sieht wie folgt aus:

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

Ich möchte nicht einen externen Anruf für JS machen, weil (a) es ist langsamer und (b) es ist nicht zuverlässig. Ich möchte eine lokale Kopie verwenden und ich setze diesen Weg als solche, aber es wird nicht geladen in.

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

Was ist das Problem hier? Warum funktioniert mein Weg nicht so, wie ich es erwarte? Erlaubt diese Funktion page.includeJs relative Pfade nicht?

Antwort

3

Gemäß der Dokumentation enthält diese Funktion das Skript von der angegebenen URL, auf das von der gehosteten Seite aus zugegriffen werden muss. Offensichtlich ist Ihr lokaler Pfad auf dem Remote-Host nicht erreichbar (relativ oder absolut), so dass Sie stattdessen das Skript mit injectJs einspeisen müssen.

bearbeiten: Hier ist der Code, den ich für den Test verwendet:

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


Der zusätzliche Code kann auch auf die gleiche Weise wie jquery injiziert werden und wird sicher arbeiten. Denken Sie daran, über evaluate() Einschränkungen (aber es ist nicht wirklich eine große Sache in diesem Fall):

Hinweis: die Argumente und den Rückgabewert die Funktion auswerten muss ein einfaches primitives Objekt sein. Die Faustregel: Wenn es über JSON serialisiert werden kann, ist es in Ordnung.

Verschlüsse, Funktionen, DOM-Knoten usw. funktionieren nicht!


bearbeiten: Auch über Ihr Filepath Problem: check what is your working directory. Die Verwendung relativer Pfade kann deshalb schwierig sein, daher empfehle ich Ihnen, absolut zu verwenden. webpage.libraryPath ist alles was Sie brauchen. Ich hoffe, ich habe dir jetzt geholfen.

+0

Versucht injectJs auch. Pfad löst auch nicht auf. Beim Lesen der Dokumente denke ich, dass sie auch subtile Unterschiede haben. – fyz

+0

@fab Ja, es gibt einige Unterschiede, aber es ist die einzige Möglichkeit, lokales Skript auszuführen. Sie liefern wahrscheinlich einen falschen Dateipfad. Versuchen Sie es mit absolutem und sehen Sie, ob es funktioniert. – ghost

+0

Btw 'injectJs' ist nicht korrekt DOCS:" Hinweis: Die Argumente und der Rückgabewert der Funktion evaluate müssen ein einfaches primitives Objekt sein. Die Faustregel: Wenn es über JSON serialisiert werden kann, ist es in Ordnung. Verschlüsse, Funktionen, DOM-Knoten usw. funktionieren nicht! " Siehe Link: http://phantomjs.org/api/webpage/method/inject-js.html – fyz

Verwandte Themen