2015-07-11 9 views
18

Utilizzo il selettore web del selenio Python per esplorare alcune pagine. Voglio iniettare un codice javascript in una pagina prima che qualsiasi altro codice Javascript venga caricato ed eseguito. D'altra parte, ho bisogno che il mio codice JS sia eseguito come il primo codice JS di quella pagina. C'è un modo per farlo con il selenio?Selenio: Come iniettare/eseguire un Javascript in una pagina prima di caricare/eseguire qualsiasi altro script della pagina?

L'ho cercato su Google per un paio d'ore, ma non ho trovato nessuna risposta adeguata!

+0

Ma la mia domanda è che come posso iniettare codice JS utilizzando Selenium Webdriver prima del caricamento della pagina. Non ho accesso al contenuto di tali pagine, quindi non posso inserire un codice JS in esse, a meno che non utilizzi un proxy per riscrivere il contenuto della pagina. – Alex

+3

Penso, ho trovato la risposta. Secondo http://grokbase.com/t/gg/selenium-users/12a99543jq/is-there-a---to-inject-javascripts-before-page-onload, non possiamo farlo se non utilizziamo un proxy iniettare uno script all'inizio della pagina. – Alex

+1

Sarebbe possibile installare un'applicazione come GreaseMonkey o Tampermonkey per iniettare gli script? https://addons.mozilla.org/en-us/firefox/addon/greasemonkey/ –

risposta

3

Se non è possibile modificare il contenuto della pagina, è possibile utilizzare un proxy o utilizzare uno script di contenuto in un'estensione installata nel browser. Facendolo all'interno del selenio si scriverà del codice che inietta lo script come uno dei figli di un elemento esistente, ma non sarà possibile eseguirlo prima che la pagina venga caricata (quando la chiamata get() del driver viene restituita)

String name = (String) ((JavascriptExecutor) driver).executeScript(
    "(function() { ... })();" ... 

La documentazione lascia non specificato il momento in cui il codice inizia l'esecuzione. Lo si vorrebbe prima che il DOM inizi a caricarsi in modo tale che la garanzia possa essere soddisfatta solo con il proxy o il percorso di script del contenuto dell'estensione.

Se è possibile strumentare la pagina con un'imbracatura minima, è possibile rilevare la presenza di un parametro di query url speciale e caricare contenuto aggiuntivo, ma è necessario farlo utilizzando uno script incorporato. Pseudocode:

<html> 
    <head> 
     <script type="text/javascript"> 
     (function() { 
     if (location && location.href && location.href.indexOf("SELENIUM_TEST") >= 0) { 
      var injectScript = document.createElement("script"); 
      injectScript.setAttribute("type", "text/javascript"); 

      //another option is to perform a synchronous XHR and inject via innerText. 
      injectScript.setAttribute("src", URL_OF_EXTRA_SCRIPT); 
      document.documentElement.appendChild(injectScript); 

      //optional. cleaner to remove. it has already been loaded at this point. 
      document.documentElement.removeChild(injectScript); 
     } 
     })(); 
     </script> 
    ... 
3

Se si desidera inserire qualcosa nell'html di una pagina prima che venga analizzato ed eseguito dal browser, suggerirei di utilizzare un proxy come Mitmproxy.