首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为BrowserUp Proxy HAR-Object写入HAR文件

如何为BrowserUp Proxy HAR-Object写入HAR文件
EN

Stack Overflow用户
提问于 2019-08-07 23:49:56
回答 1查看 646关注 0票数 1

我使用BrowserUp (https://github.com/browserup/browserup-proxy)代理跟踪我的HTTP请求,并从服务器获取一个HAR对象。遗憾的是,BrowserUp不包含将此对象写入文件的方法,这就是我使用与BrowserMob相同的方法的原因。问题是:从中产生的文件似乎格式不正确(Gatling在索引23处为时间格式抛出一个异常,如果我将其转换为jmx jmeter,则表明它不包含http请求)。

我的代码:

代码语言:javascript
复制
    // 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();

控制台输出的一个片段:

代码语言:javascript
复制
    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-object中。你有关于如何将其写入文件的想法吗?

EN

回答 1

Stack Overflow用户

发布于 2019-08-08 23:28:09

由于BrowserUp Proxy还没有提供这样做的方法,所以我构建了一个适合我的方法:

代码语言:javascript
复制
    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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57398165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档