2014-10-19 12 views
6

Sto usando PhantomJS per schermare una pagina web. Tuttavia la libreria chiama un file jQuery ospitato per iniettare funzionalità jQuery nel DOM della pagina per consentire alcune manipolazioni. Visto qui: http://phantomjs.org/api/webpage/method/include-js.htmlPhantomjs utilizza un file locale con page.includeJs?

Il codice è simile al seguente:

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

non voglio fare una chiamata esterna per JS perché (a) è più lento e (b) non la sua affidabilità. Vorrei utilizzare una copia locale e ho impostato questa strada in quanto tale, ma non viene caricato in.

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

Qual è il problema? Perché il mio percorso non funziona come mi aspetto? Questa funzione page.includeJs non consente percorsi relativi?

risposta

3

Secondo la documentazione questa funzione include lo script dall'URL dato che deve essere accessibile dalla pagina ospitata. Ovviamente il percorso locale non è accessibile sull'host remoto (relativo o assoluto), quindi è necessario iniettare lo script con injectJs.

Edit: Ecco il codice che ho usato per il test:

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


Il codice aggiuntivo può essere anche iniettato nello stesso modo come jQuery e funzionerà di sicuro. Ricordate circa evaluate() limitazioni (ma in realtà non è un grosso problema in questo caso):

Nota: Gli argomenti e il valore di ritorno al valutare funzione deve essere un semplice oggetto primitivo. La regola generale: se può essere serializzato tramite JSON, allora va bene.

Chiusure, funzioni, nodi DOM, ecc. Non funzioneranno!


Edit: anche circa il tuo problema filepath: check what is your working directory. Usare percorsi relativi può essere difficile a causa di ciò quindi ti suggerisco di usare assoluto. webpage.libraryPath è tutto ciò di cui hai bisogno. Spero di averti aiutato ora.

+0

Anche iniettato. Il percorso non si risolve neanche. Dalla lettura dei documenti penso che abbiano anche sottili differenze. – fyz

+0

@fab Sì, ci sono alcune differenze ma è l'unico modo per eseguire uno script locale. Probabilmente stai fornendo un percorso file errato. Prova ad usare quello assoluto e controlla se funziona. – ghost

+0

Btw 'injectJs' non è corretto DOCS:" Nota: gli argomenti e il valore restituito per la funzione di valutazione devono essere un semplice oggetto primitivo La regola pratica: se può essere serializzato tramite JSON, va bene Chiusure, funzioni, nodi DOM, ecc. Non funzioneranno! " Vedi link: http://phantomjs.org/api/webpage/method/inject-js.html – fyz

Problemi correlati