如何在 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 它已发布)
- 浏览器对此没有影响
我在 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 它已发布)
- 浏览器对此没有影响