监控JSON wire协议日志

8 投票
2 回答
1737 浏览
提问于 2025-04-21 08:22

根据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 个回答

5

我找到一个差不多符合我需求的选项。

把日志记录器直接连接到 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

虽然我看不到响应,但这已经算是进步了。

6

当你使用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项目提交过错误报告和修复建议。

撰写回答