我使用BrowserUp(https://github.com/browserup/browserup-proxy)代理跟踪我的HTTP请求,并从服务器获取HAR对象。遗憾的是,BrowserUp没有包含将此对象写入文件的方法,这就是为什么我使用与BrowserMob相同的方法的原因。问题是:出来的文件似乎没有正确格式化(Gatling在索引23处的时间Format抛出了异常,如果我将其转换为jmx jmeter,则说它不包含http请求)
我的代码:
// Start the BrowserMob proxy
BrowserUpProxy server = new BrowserUpProxyServer();
server.setHarCaptureTypes(CaptureType.REQUEST_CONTENT);
NativeResolver resolver = new NativeResolver();
resolver.getHostRemappings();
System.out.println("resolver:" + resolver);
server.setHostNameResolver(resolver);
server.start();
server.newHar();
// Get selenium proxy
Proxy proxy = ClientUtil.createSeleniumProxy(server);
GeckoDriverService geckoservice = new GeckoDriverService.Builder()
.usingDriverExecutable(new File("C:/ProgrammeZwei/geckodriver.exe")).usingAnyFreePort()
.usingAnyFreePort().build();
try {
geckoservice.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Configure desired capability for using proxy server with WebDriver
FirefoxOptions options = new FirefoxOptions();
options.setProxy(proxy);
options.addPreference("network.proxy.allow_hijacking_localhost", true);
// Set up driver
WebDriver driver = new FirefoxDriver(geckoservice, options);
driver.get("https://www.google.com");
Har har = server.getHar();
List<HarEntry> entries = server.getHar().getLog().getEntries();
for (HarEntry entry : entries) {
Date date = entry.getStartedDateTime();
System.out.println("startedtime:" + date.toString() + " request:" + entry.getRequest().getMethod() + ":"
+ entry.getRequest().getUrl());
}
String pfad = System.getProperty("user.dir") + File.separator + System.currentTimeMillis() + "MiniTest.har";
File harFile = new File(pfad);
ObjectMapper mapper = new ObjectMapper();
try {
mapper.writeValue(harFile, har.getLog());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Close the browser
driver.quit();
控制台输出的片段:
startedtime:Wed Aug 07 17:46:26 CEST 2019 request:GET:https://www.google.com/
startedtime:Wed Aug 07 17:46:26 CEST 2019 request:GET:https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png
startedtime:Wed Aug 07 17:46:26 CEST 2019 request:GET:https://www.google.com/gen_204?atyp=i&ct=rfl&cad=&ei=UvJKXYvRDY3awALA4qDYCg&zx=1565192786421
startedtime:Wed Aug 07 17:46:26 CEST 2019 request:GET:https://www.google.com/gen_204?atyp=i&ct=rfl&cad=&ei=UvJKXYvRDY3awALA4qDYCg&zx=1565192786442
所以我想所有数据都正确地收集在har对象中。 您是否有关于如何将此写入文件的想法?
答案 0 :(得分:0)
由于BrowserUp Proxy尚不提供执行此操作的方法,因此我建立了一种适用于我的方法:
private void writeHAR(File harFile, HarLog log) throws IOException {
String version = log.getVersion();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSS'Z'");
JsonGenerator jsonGenerator = new JsonFactory().createGenerator(harFile, JsonEncoding.UTF8);
ObjectMapper objectMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
jsonGenerator.setCodec(objectMapper);
jsonGenerator.useDefaultPrettyPrinter();
// Begin File
jsonGenerator.writeStartObject();
// Begin log
jsonGenerator.writeFieldName("log");
// Begin log object
jsonGenerator.writeStartObject();
jsonGenerator.writeFieldName("version");
jsonGenerator.writeObject(version);
jsonGenerator.writeFieldName("creator");
jsonGenerator.writeObject(log.getCreator());
jsonGenerator.writeFieldName("pages");
// pages field contains an array of objects
jsonGenerator.writeStartArray();
// create the objects in the pages array
for (HarPage page : log.getPages()) {
jsonGenerator.writeStartObject();
jsonGenerator.writeFieldName("startedDateTime");
jsonGenerator.writeObject(dateFormat.format(page.getStartedDateTime()));
jsonGenerator.writeFieldName("id");
jsonGenerator.writeObject(page.getId());
jsonGenerator.writeFieldName("title");
jsonGenerator.writeObject(page.getTitle());
jsonGenerator.writeFieldName("pageTimings");
jsonGenerator.writeObject(page.getPageTimings());
jsonGenerator.writeEndObject();
}
// end of pages array
jsonGenerator.writeEndArray();
jsonGenerator.writeFieldName("entries");
// Begin of entris array
jsonGenerator.writeStartArray();
// write object for each entry
for (HarEntry entry : log.getEntries()) {
jsonGenerator.writeStartObject();
jsonGenerator.writeFieldName("startedDateTime");
jsonGenerator.writeObject(dateFormat.format(entry.getStartedDateTime()));
jsonGenerator.writeFieldName("time");
jsonGenerator.writeObject(entry.getTime());
jsonGenerator.writeFieldName("request");
jsonGenerator.writeObject(entry.getRequest());
jsonGenerator.writeFieldName("response");
jsonGenerator.writeObject(entry.getResponse());
jsonGenerator.writeFieldName("timings");
// object timings has multiple fields
jsonGenerator.writeObject(entry.getTimings());
jsonGenerator.writeFieldName("serverIPAddress");
jsonGenerator.writeObject(entry.getServerIPAddress());
jsonGenerator.writeFieldName("connection");
jsonGenerator.writeObject(entry.getConnection());
jsonGenerator.writeFieldName("pageref");
jsonGenerator.writeObject(entry.getPageref());
// end entry object
jsonGenerator.writeEndObject();
}
// end of entries Array
jsonGenerator.writeEndArray();
// end of log object
jsonGenerator.writeEndObject();
// close File
jsonGenerator.close();
}
这是我在BrowserUp github上发布的问题(因为我不确定我的方法是否适用于所有人): https://github.com/browserup/browserup-proxy/issues/143