Einstellen des Timeouts auf selen webdriver.PhantomJS

8

Die Situation

Ich habe ein einfaches Python-Skript, um die HTML-Quelle für eine gegebene URL zu erhalten:

%Vor%

Gelegentlich zeigt die URL auf eine Seite mit langsam ladenden externen Ressourcen (z. B. Videodateien oder sehr langsamer Werbeinhalt).

Webdriver wartet, bis diese Ressourcen geladen sind, bevor die .get(url) -Anforderung abgeschlossen wurde.

Hinweis: Aus anderen Gründen muss ich dies mit PhantomJS tun anstatt mit requests oder urllib2

Die Frage

Ich möchte eine Zeitüberschreitung beim Laden der PhantomJS-Ressourcen festlegen. Wenn die Ressource zu lange zum Laden braucht, geht der Browser davon aus, dass sie nicht existiert oder was auch immer.

Dies würde mir erlauben, die nachfolgende .pagesource -Abfrage durchzuführen, basierend auf dem, was der Browser geladen hat.

Dokumentation zu webdriver.PhantomJS ist sehr dünn, und ich habe keine ähnliche Frage zu SO gefunden.

Danke im Voraus!

    
tohster 12.02.2014, 20:58
quelle

2 Antworten

10

PhantomJS hat resourceTimeout bereitgestellt, das Ihren Anforderungen entspricht. Ich zitiere aus der Dokumentation hier

  

(in Millisekunden) definiert das Zeitlimit, nach dem eine Ressource angefordert wurde   wird aufhören zu versuchen und mit anderen Teilen der Seite fortfahren.   onResourceTimeout Callback wird bei Timeout aufgerufen.

Also in Ruby können Sie etwas wie

tun %Vor%

Ich glaube an Python, es ist etwas wie (ungetestet, bietet nur die Logik, Sie sind der Python-Entwickler, hoffentlich werden Sie herausfinden)

%Vor%     
Yi Zeng 12.02.2014, 21:31
quelle
13

Lange Erklärung unten, also TLDR :

Die aktuelle Version von Seleniums Ghostdriver (in PhantomJS 1.9.8) ignoriert die Option resourceTimeout, verwendet implizit_wait (), set_page_load_timeout () von webdriver und umschließt sie unter try-except block.

%Vor%

Erläuterung

Um Selenium PhantomJS Seiteneinstellungen zur Verfügung zu stellen, kann man die DesiredCapabilities des Webdrivers verwenden wie:

%Vor% %Vor%

Aber, hier ist der Haken: Wie heute (2014 / Dez / 11) mit PhantomJS 1.9.8 und seinem eingebetteten Ghostdriver wird ressourceTimeout nicht von Ghostdriver übernommen ( Siehe Ghostdriver-Ausgabe # 380 in Github ).

Um das Problem zu umgehen, verwenden Sie einfach die Timeout-Funktionen / Methoden von Selenium und wickeln Sie die get-Methode von webdriver in einen try-except / try-catch-Block ein, z. B.

%Vor% %Vor%     
EwyynTomato 11.12.2014 07:56
quelle