1

I wrote an extension for Arquillian-Drone that is supposed to record the HTTP-Requests of the Test and create a HAR-File for each method. The HAR Files are created ( well most of the time ... it seems to be a bit unstable at the moment), but they do not contain the URLs of the HTTP Requests

I have found another Question here on stackoverflow, that describes the same result, but the answer there was not a solution in my case.

(Ticket: BrowserMob Proxy + Selenium: Not receiving any HTTP responses )

Instantiator:

@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);

}

Observers:

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();

}

Snipped of my 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":[],

so it appears that the urls are somehow replaced with the HAR-name (like in the other ticket)

I already use BrowserMob like it was suggested in the other ticket:

compile group: 'net.lightbody.bmp', name: 'browsermob-core', version: '2.1.5'

any ideas would be much appreciated!

edit: I use the following versions:

  • Browsermob Core: 2.1.5
  • Arquillian : 1.4.1-Final
  • Drone: 2.5.1
  • Selenium: 3.14.0
  • Firefox 67.0
  • GeckoDriver: 0.24.0

edit

I think i know the root of the problem: the tracking protection of Firefox. I tried to implement a Firefox Profile, that has the Preference for Tracking protection set to false, but somehow the changes won´t show in my browser. Is there anything that needs to be considered when changing preferences?

2 Answers2

1

i have found a solution to my problem now: 1. the BrowserMob (or BrowserUp) ProxyServer needs to be initialized and started at an Event before the Drone Initializer creates the Driver (I used ManagerStarted) and 2. the Firefox Browser turns off the proxy for requests to the localhost (at least when it is in automation mode). the fix to this was adding this preference: options.addPreference("network.proxy.allow_hijacking_localhost", true);

hope this will help others :)

0

I would call newPage so you don't get the weird title. Requests are grouped into pages. The URL's are going to be in the entries section and will have the pageref you pass to newpage. It looks like you're not capturing the traffic yet, so that's another issue to debug.

ebeland
  • 1,514
  • 10
  • 20
  • the "weird titel" is actually required. it is constructed like "arquilliantest"+timestamp+NameOfTheTestMethod the actual problem is that no HTTP requests are in the HAR file (like i said in the original question) – CursedJuggernaut Jun 21 '19 at 07:35
  • It's hard to tell the way it is written? What did you intend with "it appears that the urls are somehow replaced with the HAR-name" – ebeland Jun 21 '19 at 10:37
  • https://github.com/mozilla/geckodriver/issues/97 https://github.com/lightbody/browsermob-proxy/issues/578 – ebeland Jun 21 '19 at 10:46
  • thx for the input. Those Bugs should not apply to me tho. (Tried it aswell, but did not help) I added the version-numbers to the original post for more clarification. – CursedJuggernaut Jun 24 '19 at 15:15