如何在 BrowserMob-Proxy 2.0 中添加 RequestInterceptor 和更改 Referer

How to add RequestInterceptor and change Referer in BrowserMob-Proxy 2.0

我在 Selenium 测试套件中使用 BrowserMob-Proxy。我想更改 Referer 以进行一些测试。我已将 2.0 文档中的 requestInterceptor 添加到我们的 MyProxy class 中,虽然它不会生成错误,但 Referer 没有更改。

目前,我正在尝试让 requestInterceptor 在创建代理的 MyProxy class 中工作。最后希望每次测试都能指定Referer

如果有人对让 requestInterceptor 工作有任何建议,请告诉我。这是 MyProxy class。如果其他代码示例有助于解决此问题,请告诉我。

import org.openqa.selenium.Proxy;

import net.lightbody.bmp.core.har.Har;
import net.lightbody.bmp.proxy.ProxyServer;
import net.lightbody.bmp.proxy.http.BrowserMobHttpRequest;
import net.lightbody.bmp.proxy.http.RequestInterceptor;

public class MyProxy {
    private ProxyServer proxy;
    private boolean initialized;

    public Har endCapture() throws Exception {
        Thread.sleep(15000);
        return this.proxy.getHar();
    }

    public Proxy getSeleniumProxy() {
        return this.proxy.seleniumProxy();
    }

    public boolean isInitialized() throws Exception {
        return this.initialized;
    }

    public void start() throws Exception {
        int proxyPort = Integer.parseInt(System.getProperty("proxyPort"));
        this.proxy = new ProxyServer(proxyPort);
        this.proxy.start();
        this.proxy.setCaptureHeaders(true);
        this.proxy.setCaptureContent(true);

        this.proxy.addRequestInterceptor(new RequestInterceptor() {
            @Override
            public void process(BrowserMobHttpRequest request, Har har) {
                request.getMethod().removeHeaders("Referer");
                request.getMethod().addHeader("Referer", "http://www.google.com");
            }
        });

        this.initialized = true;
    }

    public void startCapture() throws Exception{
        this.proxy.newHar("MyHar");
    }

    public void stop() throws Exception {
        this.proxy.stop();
        this.initialized = false;
    }
}

查看此 issue 并查看它是否描述了您的问题。

建议移动到最新版本的 BrowserMobProxy,即 2.1.0-beta-5。

我认为这里的关键是如何测试 newly-added header,这很难手动完成。

我选择了 test-site: http://headers.cloxy.net/request.php,它只记录所有请求 header 的名称和值。首先设置我的代理,我安排了页面请求完成后编写的屏幕截图。

我能够确定:

 @Override
 public void process(BrowserMobHttpRequest req, Har har) {
     req.getMethod().removeHeaders("Referer");
     req.getMethod().addHeader("Referer", "http://www.google.xyz");

     // Some extras
     req.getMethod().addHeader("Foo_" + System.currentTimeMillis(), "Bar_" + new java.util.Date());
     req.getMethod().setHeader("Lorem_" + System.currentTimeMillis(), "Ipsum_" + new java.util.Date());
 }

... 在 BrowserMob 2.0.0 和 2.1 beta 5 中成功添加了 all 指定的 headers。我已经为 Firefox (45)、Chrome (49) 和 PhantomJS 中的每个版本确认了这一点。

所以,简而言之:

  • OP 的 header-adding 语法非常好。
  • setHeader 也按预期工作。
  • BMP 版本号对此没有影响(但一定要升级到 2.1 as/when 它已发布)
  • 浏览器对此没有影响