2014-09-12 57 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