Как написать HAR-файл для HAR-объекта BrowserUp Proxy

Я отслеживаю свои HTTP-запросы с помощью BrowserUp (https://github.com/browserup/browserup-proxy) Прокси и получить объект HAR с сервера. К сожалению, BrowserUp не содержит метода для записи этого объекта в файл, поэтому я использую тот же метод, что и BrowserMob. Проблема в том, что файл, который выходит из него, кажется, неправильно отформатирован (Гатлинг выдает исключение для формата времени по индексу 23, и если я конвертирую его в 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-объекте. У вас есть идея, как записать это в файл?


person CursedJuggernaut    schedule 07.08.2019    source источник
comment
В предыдущей версии BrowserUp Proxy у нас было несколько ошибок, из-за которых выходные данные нарушали спецификацию har в некоторых незначительных аспектах, например, помещая строку вместо ожидаемого int — что-то в этом роде. У BrowserMob они тоже были. Можете ли вы попробовать самую последнюю версию, если это не то, что у вас есть? Кроме того, не стесняйтесь запрашивать способ записи файла har здесь: github.com/browserup/ browserup-proxy/issues. У нас есть дорожная карта хорошего размера, так что это может быть не сразу, но это кажется разумной функцией, о которой стоит попросить.   -  person ebeland    schedule 08.08.2019
comment
Если формат времени не соответствует спецификации, не стесняйтесь сообщать об этом как о проблеме, хотя мы проверили спецификацию, когда исправили последние проблемы, так что будем надеяться.   -  person ebeland    schedule 08.08.2019
comment
я запросил улучшение и предложил быстрое исправление, аннотируя har-классы некоторыми аннотациями json. может быть, так исправление может быть быстрее :)   -  person CursedJuggernaut    schedule 08.08.2019
comment
Я использую прокси-сервер браузера. Но получаю пустой ХАР. Что может быть причиной. Я использовал код, указанный на странице прокси-сервера github в браузере.   -  person UmeshPathak    schedule 13.07.2020


Ответы (1)


Поскольку 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();
}

это проблема, которую я разместил на github BrowserUp (поскольку я не уверен, что мой метод будет работать для всех): https://github.com/browserup/browserup-proxy/issues/143

person CursedJuggernaut    schedule 08.08.2019