如何将 browsermob 与 python-selenium 一起使用?

How to use browsermob with python-selenium?

我想在使用 selenium 进行 GUI 测试时使用 browsermob 来监视网络连接。我找到了一些资料和文档 and here and here,但完全不清楚如何真正使用它。

文档中写着:

server = Server("path/to/browsermob-proxy")

但是那条路是什么?在哪里可以找到它?

我也看到了

java -jar browsermob.jar --port 9090

但没有解释这个 jar 文件是什么,如果它是 browsermob 安装的一部分,或者不相关的东西。

如果有人可以提供有关如何使用 browsermob 以及我需要安装的所有内容的完整且有效的示例,我将不胜感激...

您需要将驱动程序配置为使用 BMP 作为代理,以便它可以记录网络 activity。这是一个例子....

from browsermobproxy import Server
from selenium import webdriver

server = Server('/path/to/bmp/bin/browsermob-proxy') #Local path to BMP
server.start()
proxy = server.create_proxy() #Proxy is used to generate a HAR file containing the connection URLS that the MP3s are loaded from.
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--proxy-server={0}".format(proxy.proxy)) #Configure chrome options
driver = webdriver.Chrome(chrome_options=chrome_options)
proxy.new_har('filename') 

然后所有activity将被记录到那个文件。

在我的例子中,二进制文件的路径是 C:\Python27\Lib\site-packages\browsermobproxy\browsermob-proxy-2.1.0-beta-3\bin\browsermob-proxy on Windows with Python 2.7

BrowserMob Proxy

BrowserMob Proxy 是一个开源工具,用于捕获 HAR 格式的 Web 应用程序的性能数据 .它还允许操纵浏览器行为和流量,例如模拟网络流量、重写 HTTP 请求和响应等,以及操纵来自 AJAX 应用程序的网络流量。简而言之,BrowserMob proxy 帮助我们使用 Selenium WebDriver 自动化测试捕获 Web 应用程序的客户端性能数据。

您可以从 Python Documentation and this tutorial.

中找到有关 BrowserMob Proxy 的更多详细信息

在 Windows

上使用 Python 客户端演示 BrowserMob Proxy 2.0
  • 通过 CLI 安装 browsermob-proxy :

    C:\Users\your_user>pip install browsermob-proxy
    Collecting browsermob-proxy
      Downloading browsermob-proxy-0.8.0.tar.gz
    Collecting requests>=2.9.1 (from browsermob-proxy)
      Downloading requests-2.18.4-py2.py3-none-any.whl (88kB)
        100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 92kB 148kB/s
    Collecting idna<2.7,>=2.5 (from requests>=2.9.1->browsermob-proxy)
      Downloading idna-2.6-py2.py3-none-any.whl (56kB)
        100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 61kB 639kB/s
    Collecting urllib3<1.23,>=1.21.1 (from requests>=2.9.1->browsermob-proxy)
      Downloading urllib3-1.22-py2.py3-none-any.whl (132kB)
        100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 133kB 250kB/s
    Collecting certifi>=2017.4.17 (from requests>=2.9.1->browsermob-proxy)
      Downloading certifi-2017.11.5-py2.py3-none-any.whl (330kB)
        100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 337kB 401kB/s
    Collecting chardet<3.1.0,>=3.0.2 (from requests>=2.9.1->browsermob-proxy)
      Downloading chardet-3.0.4-py2.py3-none-any.whl (133kB)
        100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 143kB 296kB/s
    Installing collected packages: idna, urllib3, certifi, chardet, requests, browse
    rmob-proxy
      Running setup.py install for browsermob-proxy ... done
    Successfully installed browsermob-proxy-0.8.0 certifi-2017.11.5 chardet-3.0.4 id
    na-2.6 requests-2.18.4 urllib3-1.22
    
  • Download browsermob-proxy 二进制文件 browsermob-proxy-2.1.4-bin 形式以下 url :

    https://bmp.lightbody.net/
    
  • ExtractSave C:\Utility

  • 中的目录
  • Launch Browsermobproxy 服务器 手动通过 CLI 命令:

    C:\Utility\browsermob-proxy-2.1.4\lib>java -jar browsermob-dist-2.1.4.jar --port 9090
    Running BrowserMob Proxy using LittleProxy implementation. To revert to the legacy implementation, run the proxy with the command-line option '--use-littleproxy false'.
    [INFO  2018-01-17T19:01:30,276 net.lightbody.bmp.proxy.Main] (main) Starting BrowserMob Proxy version 2.1.4
    [INFO  2018-01-17T19:01:30,388 org.eclipse.jetty.util.log] (main) jetty-7.x.y-SNAPSHOT
    [INFO  2018-01-17T19:01:30,471 org.eclipse.jetty.util.log] (main) started o.e.j.s.ServletContextHandler{/,null}
    [INFO  2018-01-17T19:01:30,871 org.eclipse.jetty.util.log] (main) Started SelectChannelConnector@0.0.0.0:9090
    
  • 您还可以通过以下代码启动 Browsermobproxy 服务器

  • 创建一个新的PyDev模块(如果使用Eclipse)并通过你的IDE编写一个基本程序如下:

    from browsermobproxy import Server
    server = Server("C:\Utility\browsermob-proxy-2.1.4\bin\browsermob-proxy")
    server.start()
    proxy = server.create_proxy()
    
    from selenium import webdriver
    profile  = webdriver.FirefoxProfile()
    profile.set_proxy(proxy.selenium_proxy())
    driver = webdriver.Firefox(firefox_profile=profile)
    
    
    proxy.new_har("google")
    driver.get("http://www.google.co.in")
    proxy.har # returns a HAR JSON blob
    
    server.stop()
    driver.quit()
    
  • 快照:

  • 将您的 Test 作为 Python 运行
  • 执行
  • 当您的 Program 执行时,您会观察到 Firefox Quantum Browser 被初始化并且 url http://www.google.co.in 打开并在测试结束时关闭。
  • 完成 Test Execution 后,您将在您的作品 space 中找到以下文件,这些文件将为您提供 Test Execution 的所有详细信息:

    bmp.log
    geckodriver.log
    server.log
    
  • 快照:

您可以试试下面的代码:

    from browsermobproxy import Server
    import psutil
    import time
    
    for proc in psutil.process_iter():
        # check whether the process name matches
        if proc.name() == "browsermob-proxy":
            proc.kill()
    
    dict = {'port': 8090}
    server = Server(path="./BrowserMobProxy/bin/browsermob-proxy", options=dict)
    server.start()
    time.sleep(1)
    proxy = server.create_proxy()
    time.sleep(1)
    from selenium import webdriver
    profile = webdriver.FirefoxProfile()
    selenium_proxy = proxy.selenium_proxy()
    profile.set_proxy(selenium_proxy)
    driver = webdriver.Firefox(firefox_profile=profile)
    
    
    proxy.new_har("google")
    driver.get("http://www.google.co.uk")
    print (proxy.har) # returns a HAR JSON blob
    
    server.stop()
    driver.quit()

有两点,如果您的代码失败,该过程有时可能会保持打开状态。所以我添加了下面的代码来关闭重复的实例。

import psutil
import time

for proc in psutil.process_iter():
    # check whether the process name matches
    if proc.name() == "browsermob-proxy":
        proc.kill()

创建代理前后各休眠 1 秒

server.start()
time.sleep(1)
proxy = server.create_proxy()
time.sleep(1)

这有助于消除由于服务器需要一些时间启动而可能面临的一些间歇性问题。

这个问题与事实有关,即安装 browsermob-proxy 不只是在做:

pip install browsermob-proxy

执行完上面的代码后,您需要转到 https://bmp.lightbody.net,下载 zip,解压,然后在 python 脚本中调用 Server() 时,确定可执行文件的路径从您刚刚创建的 zip。它位于 "bin" 文件夹中,名为 browsermob-proxy。

在我的例子中是:

server = Server("/anaconda3/lib/python3.7/site-packages/browsermobproxy/browsermob-proxy-2.1.4/bin/browsermob-proxy")