【问题标题】:How to add RequestInterceptor and change Referer in BrowserMob-Proxy 2.0如何在 BrowserMob-Proxy 2.0 中添加 RequestInterceptor 和更改 Referer
【发布时间】:2016-04-05 22:37:18
【问题描述】:

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

现在,我正在尝试让 requestInterceptor 在创建代理的 MyProxy 类中工作。最后,我希望能够在每个测试中指定Referer。

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

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;
    }
}

【问题讨论】:

  • 请注意,我无法升级到 BrowserMob-Proxy 2.1.0 beta 5,因为我遇到了无法解决的冲突。我可以只使用 littleProxy 库吗?
  • 我有很多相同的代码运行正常,因此无需进行任何不必要的升级。你确认process() 被调用了吗?如果是这样,您可以在添加后记录请求对象(getMethod() 的结果实际上是一个 HttpClient obj,而不是 Browsermob 对象)以检查其状态。语法看起来不错。最后,您如何/在哪里检查Referer:这可能是问题吗?
  • 你也可以用简单的'set'替换remove/add,因为我认为多个Referer头没有任何意义。
  • @AndrewRegan 是的,process() 正在被调用。但是,请求对象(在 addHeader()setHeader() 之后)显示的是 localhost Referer,而不是我指定的 google.com Referer。
  • @AndrewRegan 在测试运行时,我正在 Chrome 开发工具中检查请求中的引用者,并按照您的建议检查请求对象。

标签: selenium browsermob-proxy


【解决方案1】:

我认为这里的关键是如何测试新添加的标头,这很难手动完成。

我选择作为测试站点:http://headers.cloxy.net/request.php,它只记录所有请求标头的名称和值。首次设置代理后,我安排了页面请求完成后编写的屏幕截图。

我能够确定:

 @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 中添加所有指定的标头。我已经为 Firefox (45)、Chrome (49) 和 PhantomJS 中的每个版本确认了这一点。

所以,简而言之:

  • OP 的头部添加语法非常好。
  • setHeader 也可以正常工作。
  • BMP 版本号不会影响这一点(但一定会在发布时升级到 2.1)
  • 浏览器不影响这一点

【讨论】:

  • 感谢您的帮助@AndrewRegan!
【解决方案2】:

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

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

【讨论】:

  • 看起来很相似。我同意 2.1.0 会好得多。正如我上面提到的,它在我的公司网络中不起作用。
  • 2.0 有问题。 BrowserMobProxy 开发人员建议人们迁移到 2.1.0-beta-5 版本。早期的 2.1 也有问题。我建议你与当权者讨论这个问题。
  • BMP 有一个专门的测试,几乎与 OP 的代码相同,而我在 2.0 测试版中有几乎相同的代码,所以说该版本不可用(不可调试)并且必须更新似乎为时过早。
  • @AndrewRegan 我会让你和 Pierce 解决它。
猜你喜欢
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 2015-08-06
  • 2012-08-12
  • 1970-01-01
相关资源
最近更新 更多