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!
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%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%Tags und Links python selenium selenium-webdriver phantomjs