使用 BrowserMobProxy、Selenium、Firefox、marionette/gecko 获取请求和响应

Posted

技术标签:

【中文标题】使用 BrowserMobProxy、Selenium、Firefox、marionette/gecko 获取请求和响应【英文标题】:Getting Request And Response Using BrowserMobProxy, Selenium, Firefox, marionette/gecko 【发布时间】:2017-04-26 15:35:14 【问题描述】:

我正在尝试使用 BMP 的 RequestFilter 和 ResponseFilter 获取响应和请求。但是,当网页加载时,控制台中不会打印任何内容。 其他一切似乎都有效。也许 BMP 没有在看 GeckoDriver? 我正在使用 Firefox 50.0、BrowserMobProxy 2.1.2、Selenium 3.0.1 和 GeckoDriver 0.11.1 测试代码如下。有人可以帮我吗? 非常感谢!

BrowserMobProxy server = new BrowserMobProxyServer();
server.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);
server.start();
int port = server.getPort();
server.addRequestFilter((request, content, info) -> 
    String q = URLDecoder.decode(info.getOriginalUrl(), "UTF-8");
    System.out.println("Request: "+q);
    return null;
);

server.addResponseFilter((response, content, info) -> 
    String type = response.headers().get("Content-Type");
    System.out.println("Response: "+info.getOriginalRequest());
    System.out.println(type);
);

Proxy proxy = ClientUtil.createSeleniumProxy(server);
DesiredCapabilities capabilities = DesiredCapabilities.firefox();
capabilities.setCapability(CapabilityType.PROXY, proxy);
capabilities.setCapability("marionette", true);
capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
capabilities.setCapability(CapabilityType.SUPPORTS_javascript, true);
FirefoxProfile fp = new FirefoxProfile();
capabilities.setCapability(FirefoxDriver.PROFILE, fp);
String gecko = "d:/Programming/java/geckodriver.exe";
System.setProperty("webdriver.gecko.driver", gecko);
driver = new FirefoxDriver(capabilities);                    
driver.get("https://google.com");;

【问题讨论】:

【参考方案1】:

在 Firefox 51 及更低版本中,Selenium 3 的 GeckoDriver 中存在一个错误/缺失功能,该功能会阻止 Firefox 在 DesiredCapabilities 对象上设置 CapabilityType.PROXY 时获取代理设置。

但是,您仍然可以直接在FirefoxProfile 上设置代理设置。 one of BMP's tests 中有一个例子。由于您已经在使用 FirefoxProfile 对象,这对您来说可能是一个明智的解决方案。它看起来像这样(将 localhost 替换为适当的主机名/IP 地址):

FirefoxProfile fp = new FirefoxProfile();
fp.setPreference("network.proxy.http", "localhost");
fp.setPreference("network.proxy.http_port", server.getPort());
fp.setPreference("network.proxy.ssl", "localhost");
fp.setPreference("network.proxy.ssl_port", server.getPort());
fp.setPreference("network.proxy.type", 1);
fp.setPreference("network.proxy.no_proxies_on", "");

This geckodriver issue 还讨论了在 DesiredCapabilities 对象上使用 CapabilityType.PROXY 的其他一些替代方法。

更新

根据mozilla bug report,此问题已在 Firefox 52 中修复,即 2017 年 3 月 7 日的scheduled to be released。同时,FirefoxProfile 的解决方案应该适用于 51(及更低版本),并且还应该继续与 52+ 合作。

【讨论】:

以上是关于使用 BrowserMobProxy、Selenium、Firefox、marionette/gecko 获取请求和响应的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 上使用 selenium webdriver 和 browsermob 代理捕获网络流量?

Selenium通过设置代理实现抓取HTTPS请求

教你轻松截获 Selenium 中的 Ajax 数据

selenium测试(Java)-- 显式等待

第一个自动化脚本

selenium及webdriver的原理