Below is the dependencies in my maven pom.xml

<groupId>org.seleniumhq.selenium</groupId>  
<artifactId>selenium-server</artifactId>  
<version>3.14.0</version>

<groupId>net.lightbody.bmp</groupId>  
<artifactId>[browsermob-core][1]</artifactId>  
<version>2.1.5</version>

<groupId>com.browserstack</groupId>  
<artifactId>[browserstack-local-java][1]</artifactId>  
<version>1.0.3</version>

Below is the code which I'm using to initiate the BrowserMobProxy.

    private static void browserMobSeleniumProxyStart() {
        try {
            proxy = new BrowserMobProxyServer();
            proxy.setTrustAllServers(true);
            proxy.chainedProxyAuthorization(
                    System.getProperty("proxy.user"), System.getProperty("proxy.pass"), AuthType.BASIC);
            proxy.setChainedProxy(new InetSocketAddress(httpProxyHost, Integer.parseInt(httpProxyPort)));
            
            // Enable HAR.
            proxy.enableHarCaptureTypes(
                    EnumSet.of(
                            CaptureType.REQUEST_HEADERS,
                            CaptureType.REQUEST_CONTENT,
                            CaptureType.RESPONSE_CONTENT,
                            CaptureType.RESPONSE_HEADERS
                    )
            );
            proxy.start(browserLocalProxyPort);
            localHostAddress = Inet4Address.getLocalHost().getHostAddress();
            localHostPort = String.valueOf(proxy.getPort());
        } catch (Exception e) {
            proxy.stop();
            e.printStackTrace();
        }

Variables httpProxyHost and httpProxyPort are the corporateProxy IP and Port.

Below is the code to initiate the BrowserStack-local

    private static void browserStackLocalStart() {
        bsLocal = new Local();
        bsLocalArgs = new HashMap<>();
        bsLocalArgs.put("key", AUTOMATE_ACCESS_KEY);

        // BrowserStack local executable.
        bsLocalArgs.put("binarypath", format(BROWSERSTACK_PATH, "/src/test/resources/BrowserStackLocal"));

        // Force to use local and Corp proxy.
        bsLocalArgs.put("forcelocal", "true");
        bsLocalArgs.put("forceproxy", "true");

        // Set Corp Proxy and user crendentials.
        bsLocalArgs.put("proxyHost", httpProxyHost);
        bsLocalArgs.put("proxyPort", httpProxyPort);
        bsLocalArgs.put("proxyUser", System.getProperty("proxy.user"));
        bsLocalArgs.put("proxyPass", System.getProperty("proxy.password"));

        // Set local Proxy to BrowserMobProxy host - localhost ip and port and set user credentials.
        bsLocalArgs.put("localProxyHost", localHostAddress);
        bsLocalArgs.put("localProxyPort", localHostPort);
        bsLocalArgs.put("-localProxyUser", System.getProperty("proxy.user"));
        bsLocalArgs.put("-localProxyPass", System.getProperty("proxy.password"));
        seleniumProxy = ClientUtil.createSeleniumProxy(proxy);

        try {
            if(bsLocal.isRunning()) bsLocal.stop(bsLocalArgs);
            bsLocal.start(bsLocalArgs);
            log.info(format("Browser Stack Local status: %s", bsLocal.isRunning()));
        } catch (Exception e) {
            log.warning("!!! Cannot start browserstack local !!!");
        }
    }

Below is method to initiate the driver on BrowserStack

private static void setDriverWithBrowserstackOptions() {
        // Start BrowserMob proxy and browserstack-local.
        browserMobSeleniumProxyStart();
        browserStackLocalStart();

        String jobName = System.getenv("JOB_BASE_NAME");

        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setCapability("browserstack.local", "true");
        caps.setCapability("browserstack.selenium_version", "3.14.0");
        caps.setCapability("browserstack.debug","true");
        caps.setCapability("browserstack.networkLogs","false");
        caps.setCapability("acceptSslCerts", "true");
        caps.setCapability("name", testName);
        caps.setCapability("project", "SampleProj");
        caps.setCapability("sessionName", "sessionName1");
        caps.setCapability("localIdentifier", "Local Test");
        caps.setCapability("build", "Local");
        caps.setCapability("browserstack.maskCommands", "setValues, getValues, setCookies, getCookies");
        caps.setCapability(CapabilityType.PROXY, seleniumProxy);

        // Chrome Options.
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--ignore-certificate-errors");
        caps.merge(ChromeOptions.CAPABILITY, options);
        URL url = null;
        try {
            url = new URL(URL);
        } catch (MalformedURLException e) {
            log.warning("Browserstack URL may be incorrect."+ URL);
        }

        // Initiate RemoteWebDriver instanc
        WebDriver d = new RemoteWebDriver(url, caps);

        // Create new HAR.
        proxy.newHar();

        try {
            d.get("https://google.com");
            Thread.sleep(10000);

           // Fetch Har entries.
            List<HarEntry> harEntries = proxy.getHar().getLog().getEntries();
            for (HarEntry h : harEntries) {
                System.out.println("---------------- HAR Request -----------------");
                System.out.println(h.getRequest());
                System.out.println("----------------------------------------------");
                System.out.println("---------------- HAR Response -----------------");
                System.out.println(h.getResponse());
                System.out.println("----------------------------------------------");
            }
        } catch (Exception e) {
            e.printStackTrace();

        }
    }

I tried with and without BrowserMobProxy setChainedProxy but had no luck to capture the HAR entries.

Any thoughts and comments are appreciated.

1

There are 1 answers

1
Heena Nanwani On

You just have to set the following capability to capture the network logs on BrowserStack:

caps.setCapability("browserstack.networkLogs","true");

Also, you can capture the contents of the requests made using browserstack.networkLogsOptions. More details on https://www.browserstack.com/automate/capabilities