2014-09-12 69 views
6

根據硒文檔,webdriver客戶端和瀏覽器之間的交互是通過JSON Wire Protocol完成的。基本上,用python,ruby,java編寫的客戶端,將JSON消息發送到Web瀏覽器,Web瀏覽器也使用JSON進行響應。監控JSON線路協議日誌

有沒有辦法在運行硒測試時查看/捕獲/記錄這些JSON消息?

例如(在Python):

from selenium import webdriver 

driver = webdriver.Chrome() 
driver.get('http://google.com') 

driver.close() 

我想看看JSON消息蟒蛇硒之間正在進行的webdriver客戶端和瀏覽器的時候我實例化驅動程序(在這種情況下鍍鉻):webdriver.Chrome(),當我得到一個頁面:driver.get('http://google.com'),當我關閉它:driver.close()

僅供參考,在#SFSE: Stripping Down Remote WebDriver教程,它通過捕獲在腳本運行本地機和遠程服務器之間的網絡流量進行。

我把這個問題標記爲Python具體,但真的很樂意與任何指針。

+0

看看[Selenium Webdriver API文檔](http://selenium-python.readthedocs.org/api.html),似乎沒有任何可訪問的方式來使用該庫並讓它共享JSON它是產生/接收。我也可能傾向於嘗試捕捉網絡流量。 – ydaetskcoR 2014-09-12 16:17:37

+0

@ydaetskcoR謝謝,這是我目前正在考慮的內容,但不知道如果客戶端和實際驅動程序都在本地計算機上,這是否可行。決定詢問社區是否有其他選擇。 – alecxe 2014-09-12 16:19:07

+0

這可能是錯誤的方法,但您可以始終啓動虛擬機並將硒服務器放在該服務器上,以便通過虛擬網絡層捕獲網絡流量。 – ydaetskcoR 2014-09-12 16:20:56

回答

4

當您使用Chrome時,您可以指示chromedriver實例,該實例將驅動Chrome記錄比通過logging軟件包提供的更多信息。這些信息包括髮送給瀏覽器的命令及其獲取的響應。下面是一個例子:

from selenium import webdriver 

driver = webdriver.Chrome(service_log_path="/tmp/log") 
driver.get("http://www.google.com") 
driver.find_element_by_css_selector("input") 
driver.quit() 

上面的代碼將輸出日誌到/tmp/log。對應於find_element_...呼叫日誌的部分看起來像這樣:

[2.389][INFO]: COMMAND FindElement { 
    "sessionId": "b6707ee92a3261e1dc33a53514490663", 
    "using": "css selector", 
    "value": "input" 
} 
[2.389][INFO]: Waiting for pending navigations... 
[2.389][INFO]: Done waiting for pending navigations 
[2.398][INFO]: Waiting for pending navigations... 
[2.398][INFO]: Done waiting for pending navigations 
[2.398][INFO]: RESPONSE FindElement { 
    "ELEMENT": "0.3367185448296368-1" 
} 

據我所知,命令和響應忠實代表什麼是客戶端和服務器之間的事情。我已經根據我在這些日誌中看到的內容向Selenium項目提交了錯誤報告和修復。

+0

這確實是我讀過的但沒有用過的東西,看起來非常有用。雖然這是Chrome專用的,但是在與驅動程序http請求的日誌輸出結合使用後,幾乎可以看到拼圖的全貌。非常感謝你。 – alecxe 2014-09-13 01:53:27

+0

@alecxe感謝您的賞金!很高興你讚賞答案。 – Louis 2014-10-28 18:50:49

4

找到一個幾乎符合我需求的選項。

只需通過管道將記錄到stdout允許看到正在進行的基本要求:

import logging 
import sys 

from selenium import webdriver 


# pipe logs to stdout 
logger = logging.getLogger() 
logger.addHandler(logging.StreamHandler(sys.stdout)) 
logger.setLevel(logging.NOTSET) 

# selenium specific code 
driver = webdriver.Chrome() 
driver.get('http://google.com') 

driver.close() 

它打印:

POST http://127.0.0.1:56668/session {"desiredCapabilities": {"platform": "ANY", "browserName": "chrome", "version": "", "javascriptEnabled": true, "chromeOptions": {"args": [], "extensions": []}}} 
Finished Request 
POST http://127.0.0.1:56668/session/5b6875595143b0b9993ed4f66f1f19fc/url {"url": "http://google.com", "sessionId": "5b6875595143b0b9993ed4f66f1f19fc"} 
Finished Request 
DELETE http://127.0.0.1:56668/session/5b6875595143b0b9993ed4f66f1f19fc/window {"sessionId": "5b6875595143b0b9993ed4f66f1f19fc"} 
Finished Request 

我不明白的答覆,但是這已經是一個進步。

+0

這是一個相當整潔的想法。你可以做一些類似的請求,而不是urllib2嗎?它傾向於更有用 – ydaetskcoR 2014-09-12 18:02:11

+0

@ydaetskcoR好吧,硒[在引擎蓋下使用'urllib2'](https://code.google.com/p/selenium/source/browse/py/selenium/webdriver/remote/ remote_connection.py)(在Python2.x上),所以,不需要爲'requests'做同樣的事情。另外,不需要設置debuglevel,因爲它顯示selenium以'debug'級別記錄請求。只需設置適當的日誌級別就足夠了。謝謝。 – alecxe 2014-09-12 18:23:15

+0

您是否成功獲得答覆? – 2017-11-13 04:41:30