监视JSON有线协议日志

时间:2014-09-12 16:14:00

标签: python json selenium selenium-webdriver protocols

根据selenium文档,webdriver客户端和浏览器之间的交互是通过JSON Wire Protocol完成的。基本上,用python,ruby,java编写的客户端将JSON消息发送到Web浏览器,Web浏览器也响应JSON。

有没有办法在运行selenium测试时查看/捕获/记录这些JSON消息?

例如(在Python中):

from selenium import webdriver

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

driver.close()

我希望在我实例化驱动程序(在本例中为Chrome)时,查看python selenium webdriver客户端和浏览器之间的JSON消息:webdriver.Chrome(),当我收到页面时:{{1当我关闭它时:driver.get('http://google.com')

仅供参考,在#SFSE: Stripping Down Remote WebDriver教程中,它是通过捕获运行脚本的本地计算机与远程 selenium服务器之间的网络流量来完成的。 。

我将问题标记为driver.close()具体,但对任何指针都非常满意。

2 个答案:

答案 0 :(得分: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

我没有看到回复,但这已经是一个进步。

答案 1 :(得分:4)

使用Chrome时,您可以指示将驱动Chrome的chromedriver实例记录的信息多于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项目提交了错误报告和修复。