2016-05-13 178 views
2

我想讓硒在完全呈現後捕獲頁面源,如果我轉到頁面並立即捕獲頁面的某一部分已經呈現,如果我在30秒的睡眠中完全呈現,但我希望它更有效率。等待Python中的Selenium的XHR請求和/或控制檯消息

如果我們使用https://twitter.com/i/notifications作爲例子,你會發現在頁面加載5秒後有一個toast_poll和一個時間軸XHR請求。

我希望能夠檢測到其中一個請求,並等到一次觸發,那麼這是一個指示器,表示頁面已完全加載。

,我現在用大火console.log("Done")所以,如果我能在PhantomJS檢測控制檯命令&火狐那麼這將是比等待XHR請求一個更好的選擇,該網站,只是等待,直到Done出現在控制檯,然後將該是頁面已完全加載的指示符。

關於這個職位的重複標記:

這個問題是關於PhantomJS和Firefox,後Detect javascript console output with python是在一年前,給出的答覆僅適用於Chrome,我要找一個PhantomJSFirefox選項,我已經認爲基於StackOverflow是不可能的,所以這就是爲什麼我的開始是爲了等待XHR請求。

我已經嘗試下面的代碼,但它不爲我工作..我得到即使該網站是扔的console.log(「完成」)

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 

我零響應'無法測試與browser = webdriver.Firefox()註釋掉,因爲我不知道如何有兩批DesiredCapabilities集。

+0

的可能的複製[檢測與Python JavaScript控制檯輸出(http://stackoverflow.com/questions/28678872/detect-javascript-console-output-with-python) – salomonderossi

+0

@salomonderossi這不是關於'PhantomJS'和'Firefox',那篇文章只關於Chrome,我正在尋找一個PhantomJS和Firefox選項,我已經基於StackOverflow的想法是不可能的,所以這就是爲什麼我的文章開始是關於等待XHR請求的。 – Ryflex

+0

imho你也可以使用Firefox,Safari,IE或無頭PhantomJS瀏覽器 – salomonderossi

回答

1

您可以覆蓋console.log功能,並等待與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(); 
    }; 
    """)