如何在Python-Selenium中使用BrowserMob?

24

我想使用Browsermob在使用Selenium进行GUI测试时监控网络连接。我已经在这里这里这里找到了一些信息和文档,但是如何真正使用它完全不清楚。

文档中写道:

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

但是这个路径是什么?在哪里可以找到它?

另外,我看到了。

java -jar browsermob.jar --port 9090
但是关于这个JAR文件到底是什么,它是否是Browsermob安装的一部分,或者与之无关,都没有任何解释。
如果有人能够提供一个完整而可用的示例来展示如何使用Browsermob,以及我需要安装什么东西,我将不胜感激...

文档非常好,提供完整的示例:https://github.com/lightbody/browsermob-proxy#using-with-selenium - Corey Goldberg
当我尝试使用 ./browsermob-proxy -port 8080 启动代理时,出现错误 ./browsermob-proxy: line 12: $BASEDIR/lib/browsermob-dist-${project.version}.jar: bad substitution - Alex
另外,我需要为Selenium测试启动代理吗?还是在测试本身中处理?如何处理?Python实现没有提到... - Alex
https://github.com/AutomatedTester/browsermob-proxy-py - Corey Goldberg
server = Server("/Users/adietz/Projects/Invest/browsermob/browsermob-proxy/browsermob-dist/src/main/scripts/browsermob-proxy") server.start() gives error: browsermobproxy.exceptions.ProxyServerError: Can't connect to Browsermob-Proxy - Alex
还有就是没有安装browsermob-proxy-py的文档,整个存储库中也没有单独的jar文件。我错过了什么吗? - Alex
4个回答

22

BrowserMob Proxy

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

您可以从Python文档此教程中了解更多有关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
  • 从以下网址下载browsermob-proxy二进制文件browsermob-proxy-2.1.4-bin

  • https://bmp.lightbody.net/
    
  • 提取保存C:\Utility目录中的文件夹

  • 通过CLI命令手动启动Browsermobproxy服务器

  • 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()
    
  • 快照:

  • browsermobproxy

    • 将您的测试作为Python运行执行。
    • 在您的程序执行期间,您将观察到Firefox Quantum浏览器被初始化并打开http://www.google.co.in网址,并在测试结束时关闭。
    • 完成测试执行后,您会在工作空间中找到以下文件,其中包含测试执行的所有详细信息:

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


    3
    为什么所有这些都不是原始的“browsermob-proxy”文档的一部分?我应该如何知道安装什么和如何安装? - Alex
    在'server.log'/'bmp.log'中,我遇到了一个错误:无法启动Jetty服务器 - Alex
    那么这三个日志文件是用来干什么的?我在哪里可以看到正在建立的连接列表? - Alex
    再次感谢您提供详细的答案,但对我来说仍然无效。请参阅 https://stackoverflow.com/questions/48315438/how-to-fix-address-already-in-use-error-with-browsermob-proxy 以获取完整的错误描述。 - Alex
    你有没有想过如何捕获响应? - cglacet
    @undetectedSelenium 怎样在 Chrome 中使用这段代码? - RF1991

    15

    浏览器捕获 您可以尝试下面的代码:

        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)
    

    这有助于解决一些间歇性问题,这些问题可能是由于服务器启动需要一些时间而导致的。


    非常感谢。你的代码建议确实起作用了! - Alex
    @Tarun。我有疑问,如果browsermob-proxy进程正在运行并为我的网站中的一个用户进行捕获,而另一个用户开始这样做,那么它不会杀死用户A的进程和数据吗? - Dhnesh Dhingra
    @DhneshDhingra,当你执行server.start()时,它会选择一个空闲端口并启动两个进程。但是,如果手动打开浏览器,则不会产生任何影响。 - Tarun Lalwani
    @Tarun,实际上如果proc.name() == "browsermob-proxy":proc.kill(),那么所有的进程都会被杀死吗? - Dhnesh Dhingra

    5
    这个问题与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")
    

    4
    您需要配置驱动程序以使用BMP作为代理,以便记录网络活动。以下是一个示例....
    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') 
    

    那么所有的活动都将被记录在该文件中。

    在我的情况下,二进制文件的路径是 C:\Python27\Lib\site-packages\browsermobproxy\browsermob-proxy-2.1.0-beta-3\bin\browsermob-proxy,适用于使用 Python 2.7 的 Windows。


    “/path/to/bmp/bin/browsermob-proxy” 是什么意思?这是什么?如何找出在此处插入什么? - Alex
    我更新了我的回答,并注明了它的来源。我相信它是在我执行pip install时放置的。 - sytech
    啊,文档不完整啊。它没有说明如何安装那个“browsermob-proxy”,也没有告诉你需要额外安装什么。 - Alex
    可能是吧。我记得这不是一件容易的事情。我从我写的一些非常古老的代码中提取了这个功能。 - sytech
    代理服务器错误: Browsermob-Proxy服务器进程启动失败。请检查<open file '/home/adietz/Projects/Jenkins/bsp-usecase-tests/server.log', mode 'w' at 0x7fc9d3012db0>以获取有用的错误信息。 - Alex
    显示剩余2条评论

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接