2015-07-11 7 views
18

Ich benutze Selen Python Webdriver, um einige Seiten zu durchsuchen. Ich möchte einen JavaScript-Code in eine Seite einfügen, bevor andere Javascript-Codes geladen und ausgeführt werden. Auf der anderen Seite muss ich meinen JS-Code als den ersten JS-Code dieser Seite ausführen. Gibt es einen Weg, das Selenium zu tun?Selen: Wie man ein Javascript in eine Seite injiziert/ausführt, bevor andere Skripte der Seite geladen/ausgeführt werden?

Ich googelte es für ein paar Stunden, aber ich konnte keine richtige Antwort finden!

+0

Aber meine Frage ist, dass ich JS-Code mit Selenium Webdriver vor dem Laden der Seite injizieren kann. Ich habe keinen Zugriff auf den Inhalt dieser Seiten, daher kann ich keinen JS-Code einfügen, es sei denn, ich verwende einen Proxy, um den Seiteninhalt neu zu schreiben. – Alex

+3

Ich denke, ich habe die Antwort gefunden. Laut http://grokbase.com/t/gg/selenium-users/12a99543jq/is-there-a-way-to-inject-javascripts-before-page-onload, können wir das nicht tun, wenn wir keinen Proxy verwenden ein Skript am Anfang der Seite einfügen. – Alex

+1

Wären Sie in der Lage, eine Anwendung wie GreaseMonkey oder Tampermonkey zu installieren, um Ihre Skripte zu injizieren? https://addons.mozilla.org/en-us/firefox/addon/greasemonkey/ –

Antwort

3

Wenn Sie den Seiteninhalt nicht ändern können, können Sie einen Proxy verwenden oder ein Inhaltsskript in einer Erweiterung verwenden, die in Ihrem Browser installiert ist. Wenn Sie Selen verwenden, schreiben Sie einen Code, der das Skript als eines der untergeordneten Elemente eines vorhandenen Elements einfügt. Sie können es jedoch nicht ausführen, bevor die Seite geladen wird (wenn der Aufruf des Treibers

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

Die Dokumentation lässt den Zeitpunkt der Ausführung des Codes nicht näher spezifiziert. Sie möchten, dass das DOM geladen wird, damit die Garantie nur mit der Skriptroute für den Proxy- oder Erweiterungsinhalt erfüllt werden kann.

Wenn Sie Ihre Seite mit einem minimalen Kabelbaum instrumentieren können, erkennen Sie möglicherweise das Vorhandensein eines speziellen URL-Abfrageparameters und laden zusätzlichen Inhalt, aber Sie müssen dazu ein Inline-Skript verwenden. Pseudocode:

3

Wenn Sie etwas in das HTML einer Seite injizieren wollen, bevor es vom Browser geparst und ausgeführt wird, würde ich vorschlagen, dass Sie einen Proxy wie Mitmproxy verwenden.