在 Arquillian Drone 的扩展中使用 BrowserMob 代理时 HAR 不完整
HAR incomplete when using BrowserMob Proxy in an Extension for Arquillian Drone
我为 Arquillian-Drone 写了一个扩展,它应该记录测试的 HTTP 请求并为每个方法创建一个 HAR 文件。
HAR 文件已创建(大部分时间......目前似乎有点不稳定),但它们不包含 HTTP 请求的 URL
我在 Whosebug 上发现了另一个问题,它描述了相同的结果,但在我的情况下没有解决方案的答案。
(门票:)
实例化器:
@Override
public FirefoxDriver createInstance(WebDriverConfiguration arg0) {
server.setTrustAllServers(true);
server.setHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);
server.start();
System.err.println("BrowserMob Proxy running on port: " + server.getPort());
seleniumProxy = ClientUtil.createSeleniumProxy(server);
try {
hostIp = Inet4Address.getLocalHost().getHostAddress();
seleniumProxy.setHttpProxy(hostIp + ":" + server.getPort());
seleniumProxy.setSslProxy(hostIp + ":" + server.getPort());
} catch (UnknownHostException e1) {
e1.printStackTrace();
System.err.println("invalid Host Address");
}
options.setCapability(CapabilityType.PROXY, seleniumProxy);
options.setAcceptInsecureCerts(true);
geckoService = new GeckoDriverService.Builder()
.usingDriverExecutable(new File("C:/Program Files/GeckoDriver/geckodriver.exe")).usingAnyFreePort()
.build();
try {
geckoService.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new FirefoxDriver(geckoService, options);
}
观察者:
public void prepareHAR(@Observes EventContext<Test> context) throws IOException {
harFileName = "arquilliantest" + System.currentTimeMillis() + context.getEvent().getTestMethod().getName();
server.newHar(harFileName);
if (server.getHar() != null) {
System.err.print(harFileName + " is prepared");
} else {
throw new RuntimeException("HAR was not created!");
}
context.proceed();
}
public void writeHAR(@Observes EventContext<After> context) throws IOException {
Har har = server.getHar();
String pfad = System.getProperty("user.dir") + File.separator + harFileName + ".har";
if (!server.getHar().getLog().getEntries().isEmpty()) {
File harFile = new File(pfad);
har.writeTo(harFile);
System.err.print(pfad + " is saved");
List<HarEntry> entries = har.getLog().getEntries();
for (HarEntry entry : entries) {
System.err.println("Request URL: " + entry.getRequest().getUrl());
System.err.println("Entry response status: " + entry.getResponse().getStatus());
System.err.println("Entry response text: " + entry.getResponse().getStatusText());
}
} else {
throw new RuntimeException("HAR is empty!");
}
// server.newHar(harFileName);
context.proceed();
}
public void closeServer(@Observes EventContext<AfterClass> context) throws IOException {
server.endHar();
server.stop();
geckoService.stop();
context.proceed();
}
我的 HAR 截图:
{"log":{"version":"1.2","creator":{"name":"BrowserMob
Proxy","version":"2.1.5","comment":""},
"pages":
[{"id":"arquilliantest1561033479096minimaltestAnlegenKrankheit",
"startedDateTime":"2019-06-20T12:24:39.316Z",
"title":"arquilliantest1561033479096minimaltestAnlegenKrankheit",
"pageTimings":{"comment":""},"comment":""}],
"entries":
[{"pageref":"arquilliantest1561033479096minimaltestAnlegenKrankheit",
"startedDateTime":"2019-06-20T12:24:40.032Z",
"request":
{"method":"POST",
"url":"https://shavar.services.mozilla.com/downloads?client=navclient-auto-
ffox&appver=67.0&pver=2.2",
"httpVersion":"HTTP/1.1",
"cookies":[],
"headers":[],
所以 url 似乎以某种方式替换为 HAR 名称(就像在另一张票中一样)
我已经按照另一张票中的建议使用了 BrowserMob:
compile group: 'net.lightbody.bmp', name: 'browsermob-core', version: '2.1.5'
如有任何想法,我们将不胜感激!
编辑:
我使用以下 版本 :
- Browsermob 核心:2.1.5
- Arquillian:1.4.1-Final
- 无人机:2.5.1
- 硒:3.14.0
- 火狐 67.0
- 壁虎驱动程序:0.24.0
编辑
我想我知道问题的根源了:Firefox 的跟踪保护。我试图实现一个 Firefox 配置文件,将跟踪保护的首选项设置为 false,但不知何故,这些更改不会显示在我的浏览器中。更改首选项时有什么需要考虑的吗?
我会调用 newPage,这样您就不会得到奇怪的标题。请求被分组到页面中。 URL 将位于条目部分,并且将有您传递给新页面的 pageref。看起来您还没有捕获流量,所以这是另一个需要调试的问题。
我现在找到了解决我的问题的方法:1. BrowserMob(或 BrowserUp)ProxyServer 需要在 Drone Initializer 创建驱动程序(我使用 ManagerStarted)之前初始化并在事件中启动 2. Firefox浏览器关闭对本地主机请求的代理(至少在它处于自动化模式时)。对此的修复是添加此首选项:
options.addPreference("network.proxy.allow_hijacking_localhost", 真);
希望这对其他人有帮助:)
我为 Arquillian-Drone 写了一个扩展,它应该记录测试的 HTTP 请求并为每个方法创建一个 HAR 文件。 HAR 文件已创建(大部分时间......目前似乎有点不稳定),但它们不包含 HTTP 请求的 URL
我在 Whosebug 上发现了另一个问题,它描述了相同的结果,但在我的情况下没有解决方案的答案。
(门票:
实例化器:
@Override
public FirefoxDriver createInstance(WebDriverConfiguration arg0) {
server.setTrustAllServers(true);
server.setHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);
server.start();
System.err.println("BrowserMob Proxy running on port: " + server.getPort());
seleniumProxy = ClientUtil.createSeleniumProxy(server);
try {
hostIp = Inet4Address.getLocalHost().getHostAddress();
seleniumProxy.setHttpProxy(hostIp + ":" + server.getPort());
seleniumProxy.setSslProxy(hostIp + ":" + server.getPort());
} catch (UnknownHostException e1) {
e1.printStackTrace();
System.err.println("invalid Host Address");
}
options.setCapability(CapabilityType.PROXY, seleniumProxy);
options.setAcceptInsecureCerts(true);
geckoService = new GeckoDriverService.Builder()
.usingDriverExecutable(new File("C:/Program Files/GeckoDriver/geckodriver.exe")).usingAnyFreePort()
.build();
try {
geckoService.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new FirefoxDriver(geckoService, options);
}
观察者:
public void prepareHAR(@Observes EventContext<Test> context) throws IOException {
harFileName = "arquilliantest" + System.currentTimeMillis() + context.getEvent().getTestMethod().getName();
server.newHar(harFileName);
if (server.getHar() != null) {
System.err.print(harFileName + " is prepared");
} else {
throw new RuntimeException("HAR was not created!");
}
context.proceed();
}
public void writeHAR(@Observes EventContext<After> context) throws IOException {
Har har = server.getHar();
String pfad = System.getProperty("user.dir") + File.separator + harFileName + ".har";
if (!server.getHar().getLog().getEntries().isEmpty()) {
File harFile = new File(pfad);
har.writeTo(harFile);
System.err.print(pfad + " is saved");
List<HarEntry> entries = har.getLog().getEntries();
for (HarEntry entry : entries) {
System.err.println("Request URL: " + entry.getRequest().getUrl());
System.err.println("Entry response status: " + entry.getResponse().getStatus());
System.err.println("Entry response text: " + entry.getResponse().getStatusText());
}
} else {
throw new RuntimeException("HAR is empty!");
}
// server.newHar(harFileName);
context.proceed();
}
public void closeServer(@Observes EventContext<AfterClass> context) throws IOException {
server.endHar();
server.stop();
geckoService.stop();
context.proceed();
}
我的 HAR 截图:
{"log":{"version":"1.2","creator":{"name":"BrowserMob Proxy","version":"2.1.5","comment":""},
"pages": [{"id":"arquilliantest1561033479096minimaltestAnlegenKrankheit", "startedDateTime":"2019-06-20T12:24:39.316Z", "title":"arquilliantest1561033479096minimaltestAnlegenKrankheit", "pageTimings":{"comment":""},"comment":""}],
"entries": [{"pageref":"arquilliantest1561033479096minimaltestAnlegenKrankheit", "startedDateTime":"2019-06-20T12:24:40.032Z",
"request": {"method":"POST", "url":"https://shavar.services.mozilla.com/downloads?client=navclient-auto- ffox&appver=67.0&pver=2.2", "httpVersion":"HTTP/1.1", "cookies":[], "headers":[],
所以 url 似乎以某种方式替换为 HAR 名称(就像在另一张票中一样)
我已经按照另一张票中的建议使用了 BrowserMob:
compile group: 'net.lightbody.bmp', name: 'browsermob-core', version: '2.1.5'
如有任何想法,我们将不胜感激!
编辑: 我使用以下 版本 :
- Browsermob 核心:2.1.5
- Arquillian:1.4.1-Final
- 无人机:2.5.1
- 硒:3.14.0
- 火狐 67.0
- 壁虎驱动程序:0.24.0
编辑
我想我知道问题的根源了:Firefox 的跟踪保护。我试图实现一个 Firefox 配置文件,将跟踪保护的首选项设置为 false,但不知何故,这些更改不会显示在我的浏览器中。更改首选项时有什么需要考虑的吗?
我会调用 newPage,这样您就不会得到奇怪的标题。请求被分组到页面中。 URL 将位于条目部分,并且将有您传递给新页面的 pageref。看起来您还没有捕获流量,所以这是另一个需要调试的问题。
我现在找到了解决我的问题的方法:1. BrowserMob(或 BrowserUp)ProxyServer 需要在 Drone Initializer 创建驱动程序(我使用 ManagerStarted)之前初始化并在事件中启动 2. Firefox浏览器关闭对本地主机请求的代理(至少在它处于自动化模式时)。对此的修复是添加此首选项: options.addPreference("network.proxy.allow_hijacking_localhost", 真);
希望这对其他人有帮助:)