监控JSON wire协议日志
根据selenium的文档,webdriver客户端和浏览器之间的互动是通过一种叫做JSON Wire Protocol的协议来实现的。简单来说,客户端(可以用python、ruby、java等语言编写)会发送JSON格式的信息给浏览器,而浏览器也会用JSON格式来回应。
有没有办法在运行selenium测试的时候查看、捕捉或者记录这些JSON信息呢?
比如说(用Python):
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://google.com')
driver.close()
我想知道在我创建驱动的时候(这里是Chrome):webdriver.Chrome()
,在我打开一个页面的时候:driver.get('http://google.com')
,还有在我关闭它的时候:driver.close()
,这些时候python selenium webdriver客户端和浏览器之间传递了什么JSON信息。
顺便提一下,在#SFSE: Stripping Down Remote WebDriver的教程中,是通过捕捉本地机器(脚本运行的地方)和远程selenium服务器之间的网络流量来实现的。
我把这个问题标记为Python
相关,但其实任何相关的建议我都很乐意接受。
2 个回答
我找到一个差不多符合我需求的选项。
把日志记录器直接连接到 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
虽然我看不到响应,但这已经算是进步了。
当你使用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项目提交过错误报告和修复建议。