Search code examples
javaseleniumbrowsermob

browsermob in JAVA with Selenium doesn't work, different errors for browsers


I using Java with selenium and I want to use browsermob: I using same code for different browsers e.g. firefox:

        BrowserMobProxyServer proxyServer = new BrowserMobProxyServer();
        proxyServer.start();
        proxyServer.setHarCaptureTypes(CaptureType.getAllContentCaptureTypes());
        proxyServer.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);
        Proxy proxy = ClientUtil.createSeleniumProxy(proxyServer);
        DesiredCapabilities dccFirefox = DesiredCapabilities.firefox();
        dccFirefox.setCapability(CapabilityType.PROXY, proxy);
        this.driver = new FirefoxDriver(dccFirefox);

Occurs error in Firefox:

 org.openqa.selenium.SessionNotCreatedException: InvalidArgumentError: Expected [object Undefined] undefined to be an integer
Build info: version: '3.5.1', revision: '9c21bb67ef', time: '2017-08-17T15:26:08.955Z'
System info: host: 'BEN-PLL-ST1-HP', ip: '192.168.1.9', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_141'
Driver info: driver.version: FirefoxDriver
remote stacktrace: stack backtrace:
   0:           0x4bb74f - <no info>
   1:           0x4bbea9 - <no info>
   2:           0x43ce8d - <no info>
   3:           0x44ce14 - <no info>
   4:           0x44944a - <no info>
   5:           0x4203e1 - <no info>
   6:           0x407dc7 - <no info>
   7:           0x6d95b9 - <no info>
   8:           0x4173a7 - <no info>
   9:           0x6d38b3 - <no info>
  10:         0x775559cd - BaseThreadInitThunk
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.openqa.selenium.remote.W3CHandshakeResponse.lambda$new$0(W3CHandshakeResponse.java:57)
    at org.openqa.selenium.remote.W3CHandshakeResponse.lambda$getResponseFunction$2(W3CHandshakeResponse.java:104)
    at org.openqa.selenium.remote.ProtocolHandshake.lambda$createSession$24(ProtocolHandshake.java:360)
    at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
    at java.util.Spliterators$ArraySpliterator.tryAdvance(Unknown Source)
    at java.util.stream.ReferencePipeline.forEachWithCancel(Unknown Source)
    at java.util.stream.AbstractPipeline.copyIntoWithCancel(Unknown Source)
    at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
    at java.util.stream.FindOps$FindOp.evaluateSequential(Unknown Source)
    at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
    at java.util.stream.ReferencePipeline.findFirst(Unknown Source)
    at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:363)
    at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:137)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:142)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:82)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:641)
    at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:254)
    at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:236)
    at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:137)
    at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:191)
    at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:103)
    at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:137)

Chrome open normaly but pages can not be open, in console occurs error:

Failed to load resource: net::ERR_EMPTY_RESPONSE
net::ERR_PROXY_CONNECTION_FAILED

Someone have any idea why this errors occurs?


Solution

  • There is a open a issue with Geckodriver which is causing this issue. https://github.com/mozilla/geckodriver/issues/764

    You can get a workaround by using below code.

    Edit-1

    Since geckodriver the untrusted setting has changed. So updated the code to accommodate the same

    import net.lightbody.bmp.BrowserMobProxyServer;
    import net.lightbody.bmp.client.ClientUtil;
    import net.lightbody.bmp.core.har.Har;
    import net.lightbody.bmp.proxy.CaptureType;
    import org.openqa.selenium.Proxy;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.firefox.FirefoxProfile;
    import org.openqa.selenium.remote.DesiredCapabilities;
    
    import java.io.File;
    import java.io.IOException;
    
    /**
     * Created by tarun.lalwani on 5/31/17.
     */
    public class TestApp {
    
    
        public static void main(String [] args) {
    
            BrowserMobProxyServer proxyServer = new BrowserMobProxyServer();
            proxyServer.start();
            proxyServer.setHarCaptureTypes(CaptureType.getAllContentCaptureTypes());
            proxyServer.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);
            Proxy proxy = ClientUtil.createSeleniumProxy(proxyServer);
            FirefoxProfile profile = new FirefoxProfile();
            DesiredCapabilities cap = new DesiredCapabilities();
            cap.setAcceptInsecureCerts(true);
            String host = proxy.getHttpProxy().split(":")[0];
            int port = Integer.parseInt(proxy.getHttpProxy().split(":")[1]);
    
            profile.setPreference("network.proxy.type", 1);
            profile.setPreference("network.proxy.http", host);
            profile.setPreference("network.proxy.http_port", port);
            profile.setPreference("network.proxy.ssl", host);
            profile.setPreference("network.proxy.ssl_port", port);
    
            profile.setPreference("acceptInsecureCerts", true);
            cap.setCapability(FirefoxDriver.PROFILE, profile);
            FirefoxDriver driver = new FirefoxDriver(cap);
    
            proxyServer.newHar("mysite");
    
            driver.get("http://google.com");
    
            Har har = proxyServer.getHar();
            try {
                har.writeTo(new File("har.json"));
            } catch (IOException e) {
                e.printStackTrace();
            }
            driver.quit();
        }
    }
    

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>test1</groupId>
        <artifactId>test2</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.4.0</version>
        </dependency>
            <dependency>
                <groupId>net.lightbody.bmp</groupId>
                <!-- To use the legacy, Jetty-based implementation,
                     change the artifactId to browsermob-core -->
                <artifactId>browsermob-core-littleproxy</artifactId>
                <version>2.1.0-beta-6</version>
                <scope>test</scope>        </dependency>
            <dependency>
                <groupId>net.lightbody.bmp</groupId>
                <artifactId>browsermob-core-littleproxy</artifactId>
                <version>2.1.0-beta-5</version>
            </dependency>
        </dependencies>
    </project>