【问题标题】:Monitoring JSON wire protocol logs监控 JSON 有线协议日志
【发布时间】:2015-01-07 13:23:45
【问题描述】:

根据 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(),当我获取页面时:driver.get('http://google.com') 以及何时我正在关闭它:driver.close()

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

我将这个问题标记为Python 特定的,但真的很高兴有任何指针。

【问题讨论】:

  • 查看Selenium Webdriver API documentation 似乎没有任何可访问的方式来使用该库并让它共享它正在生成/接收的 JSON。我也可能倾向于尝试捕获网络流量。
  • @ydaetskcoR 谢谢,这是我目前正在考虑的,但不确定如果客户端和实际驱动程序都在本地计算机上是否可行。决定询问社区是否有其他选择。
  • 这可能是错误的方法,但您总是可以启动一个 VM 并在其上放置一个 selenium 服务器,这样您就可以捕获虚拟网络层上的网络流量。
  • 我认为这可能会有所帮助:webmasters.stackexchange.com/questions/13339/…
  • @Richard 谢谢,我认为这个话题更多的是关于浏览器与互联网的交互..

标签: python json selenium selenium-webdriver protocols


【解决方案1】:

当您使用 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 项目提交了错误报告和修复。

【讨论】:

  • 这确实是我读过但没有使用过的东西,看起来很有信息量。虽然,这是特定于 chrome 的,但是在结合从驱动程序 http 请求发出的日志记录后,您几乎可以看到拼图的全貌。非常感谢。
  • @alecxe 感谢您的赏金!很高兴您对答案表示赞赏。
【解决方案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

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

【讨论】:

  • 这是一个非常巧妙的想法。你能用请求而不是 urllib2 做类似的事情吗?它往往更有用
  • @ydaetskcoR 好吧,selenium uses urllib2 under the hood(在 Python2.x 上),所以,没有必要为 requests 做同样的事情。此外,不需要设置 debuglevel,因为 selenium 似乎使用debug 级别记录请求。只需设置适当的日志级别就足够了。谢谢。
  • 您成功收到回复了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多