Utilizzando PhantomJS, vorrei inserire del JS come se ci fosse un tag <script>
extra prima di qualsiasi altro tag <script>
. Questo perché gli script nella pagina utilizzano alcune funzioni che PhantomJS non possiede, ovvero Function.prototype.bind
e window.webkitRequestAnimationFrame
. Ho un file JS con implementazioni personalizzate dei due e vorrei che PhantomJS li usasse quando si eseguono gli script sulla pagina.PhantomJS: iniettare uno script prima di eseguire qualsiasi altro script
La difficoltà è che se faccio page.injectJs prima di page.open, lo script viene iniettato in una pagina vuota e non viene trasferito alla pagina che viene aperta.
In alternativa, se faccio page.injectJs dopo page.open, è troppo tardi perché gli errori JavaScript (funzioni indefinite) si sono già verificati.
ho trovato un modo che sembra funzionare, ma è ovviamente un hack:
page.onResourceReceived = function() {
page.injectJs('phantom-hacks.js')
};
Questo inietta molte volte (due volte per ogni risorsa, a quanto pare), ma va bene perché il mio script è idempotente . Tuttavia, mi piacerebbe sapere il modo corretto per farlo: iniettarlo solo una volta e prima che vengano eseguiti gli script sulla pagina.
Grazie :)
perché non tenere un hash di tutti i file che si desidera iniettare in cui la chiave è il file e il valore è se è stato iniettato o no e se non è stato iniettato poi iniettare? Oppure potresti semplicemente interrompere il listener di eventi dopo la prima esecuzione? – Nonconformist