2016-05-13 2 views
2

Ich versuche, Selen die Seitenquelle zu erfassen, nachdem es vollständig gerendert hat, wenn ich auf die Seite gehe und sofort nur ein bisschen von der Seite festhalte hat gerendert, wenn ich in einen Schlaf von 30 Sekunden setze es vollständig rendert, aber ich will, dass es effizienter ist.Warten auf XHR Request und/oder eine Console Nachricht für Selenium in Python

Wenn wir https://twitter.com/i/notifications als ein Beispiel verwenden, sehen Sie, dass nach 5 ~ Sekunden nach dem Laden der Seite ein Toast_Poll und eine XHR-Timeline-Anforderung vorliegt.

Ich möchte in der Lage sein, eine dieser Anfragen zu erkennen und zu warten, bis einer ausgelöst wird, dann ist das ein Indikator, dass die Seite vollständig geladen wurde.

Die Website, die ich Feuer bin mit console.log("Done") so, wenn ich die Konsolenbefehle in PhantomJS erkennen kann & Firefox dann würde dies für eine XHR Anfrage eine noch bessere Wahl sein, als warten, nur warten, bis Done in der Konsole angezeigt wird, und dann, dass ist der Indikator, dass die Seite vollständig geladen wurde.

das Doppelte Flagging dieses Beitrag Betreff:

Diese Frage in Bezug auf PhantomJS und Firefox ist, die Post Detect javascript console output with python ist von mehr als vor einem Jahr und die gegebene Antwort funktioniert nur auf Chrome, ich suche eine PhantomJS und Firefox Option, die ich denke schon basierend auf StackOverflow ist nicht möglich, so dass mein Start meiner Post wartet auf eine XHR-Anfrage.

Ich habe bereits versucht, den folgenden Code, aber es für mich nicht funktioniert .. Ich Null Antwort erhalten, auch wenn die Website eine console.log wirft ("Done")

from seleniumrequests import PhantomJS 
from seleniumrequests import Firefox 
from selenium import webdriver 
import os 

webdriver.DesiredCapabilities.PHANTOMJS['phantomjs.page.customHeaders.User-Agent'] = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/37.0.2062.120 Chrome/37.0.2062.120 Safari/537.36' 
webdriver.DesiredCapabilities.PHANTOMJS['loggingPrefs'] = { 'browser':'ALL' } 

browser = PhantomJS(executable_path="phantomjs.exe", service_log_path=os.path.devnull) 
browser = webdriver.Firefox() 
browser.set_window_size(1400, 1000) 

url = "https://website.com" 
browser.get(url) 

for entry in browser.get_log('browser'): 
    print entry 

I kann nicht mit browser = webdriver.Firefox() auskommentieren, weil ich nicht sicher bin, wie man zwei Lose DesiredCapabilities gesetzt hat.

+0

Mögliche Duplikat [Detect JavaScript-Konsole Ausgabe mit Python] (http://stackoverflow.com/questions/28678872/detect-javascript-console-output-with-python) – salomonderossi

+0

@salomonderossi Nein, das ist in Bezug auf 'PhantomJS' und' Firefox', dieser Beitrag ist nur über Chrome, ich bin auf der Suche nach einer PhantomJS und Firefox-Option, die ich bereits Think basierend auf StackOverflow ist nicht möglich, deshalb ist der Beginn meines Posts das Warten auf eine XHR-Anfrage. – Ryflex

+0

imho können Sie auch Firefox, Safari, IE oder einen kopflosen PhantomJS Browser verwenden – salomonderossi

Antwort

1

Sie könnten die console.log Funktion außer Kraft setzen und für die "Erledigt" Nachricht warten mit execute_async_script:

from selenium import webdriver 

driver = webdriver.Firefox() 
driver.set_script_timeout(10) 

driver.get("...") 

# wait for console.log("Done") to be called 
driver.execute_async_script(""" 
    var callback = arguments[0]; 
    console.log = function(message) { 
    if(message === "Done") 
     callback(); 
    }; 
    """) 
Verwandte Themen