如何为BrowserUp代理HAR对象编写HAR文件

时间:2019-08-07 15:49:55

标签: java gatling browsermob-proxy har

我使用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对象中。 您是否有关于如何将此写入文件的想法?

1 个答案:

答案 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