【发布时间】:2018-06-27 04:19:02
【问题描述】:
我仍在尝试使用browsermob-proxy (here) 在 python selenium 测试期间尝试监控网络流量(请参阅browsermobproxypy)。我正在使用以下脚本对其进行测试:
from browsermobproxy import Server
server = Server("/home/adietz/Projects/Invest/browsermob-proxy/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
server.stop()
driver.quit()
我设法安装了一个“browsermob.jar”文件(文档here 中没有很好地描述它;您必须从here 下载jar 文件)。我按如下方式启动代理:
java -jar ./browsermob-proxy-2.1.4/lib/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-18T07:47:20,761 net.lightbody.bmp.proxy.Main] (main) Starting BrowserMob Proxy version 2.1.4
[INFO 2018-01-18T07:47:20,782 org.eclipse.jetty.util.log] (main) jetty-7.x.y-SNAPSHOT
[INFO 2018-01-18T07:47:20,802 org.eclipse.jetty.util.log] (main) started o.e.j.s.ServletContextHandler{/,null}
[INFO 2018-01-18T07:47:20,885 org.eclipse.jetty.util.log] (main) Started SelectChannelConnector@0.0.0.0:9090
然后我将测试脚本运行为
python tester1.py
但是,在日志中我看到如下错误:
[WARN 2018-01-18T07:28:30,265 org.eclipse.jetty.util.log] (main) FAILED SelectChannelConnector@0.0.0.0:8080: java.net.BindException: Address already in use
[WARN 2018-01-18T07:28:30,266 org.eclipse.jetty.util.log] (main) FAILED org.eclipse.jetty.server.Server@4b41e4dd: java.net.BindException: Address already in use
[ERROR 2018-01-18T07:28:30,266 net.lightbody.bmp.proxy.Main] (main) Failed to start Jetty server. Aborting. java.net.BindException: Address already in use
at sun.nio.ch.Net.bind0(Native Method) ~[?:1.8.0_151]
at sun.nio.ch.Net.bind(Net.java:433) ~[?:1.8.0_151]
at sun.nio.ch.Net.bind(Net.java:425) ~[?:1.8.0_151]
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) ~[?:1.8.0_151]
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) ~[?:1.8.0_151]
at org.eclipse.jetty.server.nio.SelectChannelConnector.open(SelectChannelConnector.java:162) ~[browsermob-dist-2.1.4.jar:?]
at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:356) ~[browsermob-dist-2.1.4.jar:?]
at org.eclipse.jetty.server.nio.SelectChannelConnector.doStart(SelectChannelConnector.java:240) ~[browsermob-dist-2.1.4.jar:?]
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:55) ~[browsermob-dist-2.1.4.jar:?]
at org.eclipse.jetty.server.Server.doStart(Server.java:269) ~[browsermob-dist-2.1.4.jar:?]
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:55) ~[browsermob-dist-2.1.4.jar:?]
at net.lightbody.bmp.proxy.Main.main(Main.java:64) [browsermob-dist-2.1.4.jar:?]
我最好的猜测是该端口已经在使用中,或者其他东西无法正常工作。也许我需要在脚本中明确指定端口?但是怎么做呢? python 文档实际上是不存在的......
附录
-
查看源代码(!)我想出了如何设置端口。我正在使用以下行在 python 脚本中定义服务器和端口:
server = Server("/home/adietz/Projects/Invest/browsermob-proxy/browsermob-proxy-2.1.4/bin/browsermob-proxy", {'port':9090})
但无论我设置什么端口,我总是会收到以下错误:
Traceback (most recent call last):
File "tester1.py", line 5, in <module>
proxy = server.create_proxy()
File "/home/adietz/Projects/Invest/browsermob-proxy/venv_browsermob/local/lib/python2.7/site-packages/browsermobproxy/server.py", line 40, in create_proxy
client = Client(self.url[7:], params)
File "/home/adietz/Projects/Invest/browsermob-proxy/venv_browsermob/local/lib/python2.7/site-packages/browsermobproxy/client.py", line 37, in __init__
"Another server running on this port?\n%s..." % content[:512])
Exception: Could not read Browsermob-Proxy json
Another server running on this port?
java.lang.RuntimeException: java.net.BindException: Address already in use
at org.littleshoot.proxy.impl.DefaultHttpProxyServer.doStart(DefaultHttpProxyServer.java:545)
at org.littleshoot.proxy.impl.DefaultHttpProxyServer.start(DefaultHttpProxyServer.java:489)
at org.littleshoot.proxy.impl.DefaultHttpProxyServer.access$700(DefaultHttpProxyServer.java:69)
at org.littleshoot.proxy.impl.DefaultHttpProxyServer$DefaultHttpProxyServerBootstrap.start(DefaultHttpProxyServer.java:858)
at net.lightbody.bmp.Brows...
所以肯定有其他东西工作不正常......
也许我会自己编写这样的代理。似乎是更快的方法...
【问题讨论】:
-
检查其他进程可能正在使用该端口。您可以使用
lsof--lsof -i:9090执行此操作,然后终止该进程。如果未使用SO_REUSEADDR打开套接字,则操作系统可能暂时不允许您使用该端口。在 Windows 上,可能需要几分钟才能再次释放端口,即使在停止进程之后也是如此。说了这么多,我不确定你是否需要做java -jar ./browsermob-proxy-2.1.4.....——我记得,你可以单独使用 BMP 和 Python 代码,你将它指向二进制文件,它会做正确的事情。这也可能是你的问题,考虑到这个问题是有道理的 -
我检查了没有使用该端口运行的进程,即没有命令
lsof -i:9090的输出。但是,在 python 脚本中使用端口 9090 时,仅运行 python 脚本会出现Another server running on this port?错误... -
查看我们使用 BMP 的退休项目的一些内部文档,没有提到在任何地方做
java -jar。 BMP 服务器应该由 Python 代码单独启动。如果端口上没有正在运行的进程,不确定为什么会出现地址使用错误。我唯一的猜测是,就像我提到的那样,地址可能需要一些时间才能再次重用,并且因操作系统而异。如果可以的话,重新启动系统可能是值得的。您可以浏览 SO 以了解其他“正在使用的地址”问题;在这种情况下,我不认为它特定于 BMP 或 Python。 -
但是这种解释无法解释为什么我在使用许多不同的端口时会出现相同的错误(任何时候都不使用
java -jar!)。尝试了 9080、9070、1111、11111、12345、54321... 总是同样的错误。 -
是的,你是对的。这对我来说很奇怪。我唯一的其他猜测是类似于安全策略的内容,特别是如果您使用的是执行 SELinux 的操作系统。可能是ulimits的问题?如果重新启动没有清除它,我可能会建议尝试在其他日志中查找。对不起,我知道这没有多大帮助。如果你最终弄明白了,请更新。我很好奇这个问题可能是什么。
标签: python selenium proxy browsermob-proxy