代码之家  ›  专栏  ›  技术社区  ›  alecxe

监控JSON有线协议日志

  •  8
  • alecxe  · 技术社区  · 10 年前

    根据selenium文档,webdriver客户端和浏览器之间的交互是通过 JSON Wire Protocol 基本上,客户端(用python、ruby、java等编写)向web浏览器发送JSON消息,web浏览器也用JSON进行响应。

    在运行硒测试时,是否有方法查看/捕获/记录这些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 教程,通过捕获 地方的 运行脚本的计算机和 遥远的 硒服务器。

    我将问题标记为 Python 具体的,但真的很乐意使用任何指针。

    2 回复  |  直到 9 年前
        1
  •  6
  •   Louis    10 年前

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

        2
  •  5
  •   alecxe    10 年前

    找到了一个几乎符合我需求的选项。

    只需将记录仪连接到 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
    

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