Fallenreaper Fallenreaper - 2 months ago 45
Dart Question

Firefox driver fails and gets an unreachable error

Was working to do some tests with a dart web application I had put together. I ran it with

pub build
as per the standard, and then did a simple
python -m SimpleHTTPServer
to get the server up. Awesome. Can visit
localhost:8000
on both browsers.

I then go into my Java app to run some Selenium tests. Simple as run application. It succeeds with Chrome but fails with Firefox. I have tested this against other pages with different titles. It works just fine and passes both tests, but something with this seems not to work.

When the code executes, I see it open both browsers and navigate accordingly.

Java Code:

@Test
public void testWithChrome(){
WebDriver driver = new ChromeDriver(DesiredCapabilities.chrome());
testSuite(driver);
}

@Test
public void testWithFirefox(){
WebDriver driver = new FirefoxDriver(DesiredCapabilities.firefox());
testSuite(driver);
}

public void testSuite(WebDriver driver){
driver.navigate().to("http://localhost:8000/web/");
Assert.assertTrue("title should start with Polymer Todo App",
driver.getTitle().startsWith("Polymer Todo App"));

System.out.printf("This is a Test: '%s'\n", driver.getTitle());
System.out.println(driver.getTitle().startsWith("Polymer Todo App"));

driver.close();
driver.quit();
}


You can see it is quite simple. You can also see I have some print statements. Those print statements are represented in the console output. I'm just not sure why I'm getting an abort and an UnreachableBrowserException

Error:

Sep 29, 2016 10:07:44 AM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Attempting bi-dialect session, assuming Postel's Law holds true on the remote end
1475158066440 Marionette INFO Listening on port 55006
Sep 29, 2016 10:07:51 AM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C
JavaScript warning: https://normandy.cdn.mozilla.net/static/bundles/selfrepair-c889f52c56e4df3156a1.f5e450e97071.js, line 7: mutating the [[Prototype]] of an object will cause your code to run very slowly; instead create the object with the correct initial [[Prototype]] value using Object.create
JavaScript warning: http://localhost:8000/web/, line 308: mutating the [[Prototype]] of an object will cause your code to run very slowly; instead create the object with the correct initial [[Prototype]] value using Object.create
JavaScript warning: http://localhost:8000/web/index.bootstrap.initialize.dart.js, line 1: unreachable code after return statement
JavaScript warning: http://localhost:8000/web/index.bootstrap.initialize.dart.js line 3207 > Function, line 1: unreachable code after return statement
JavaScript warning: http://localhost:8000/web/index.bootstrap.initialize.dart.js, line 1: unreachable code after return statement
JavaScript warning: http://localhost:8000/web/index.bootstrap.initialize.dart.js line 3213 > Function, line 1: unreachable code after return statement
JavaScript warning: http://localhost:8000/web/index.bootstrap.initialize.dart.js, line 1: unreachable code after return statement
JavaScript warning: http://localhost:8000/web/index.bootstrap.initialize.dart.js line 3213 > Function, line 1: unreachable code after return statement
JavaScript warning: http://localhost:8000/web/index.bootstrap.initialize.dart.js, line 1: unreachable code after return statement
JavaScript warning: http://localhost:8000/web/index.bootstrap.initialize.dart.js line 3213 > Function, line 1: unreachable code after return statement
JavaScript warning: http://localhost:8000/web/index.bootstrap.initialize.dart.js, line 1: unreachable code after return statement
JavaScript warning: http://localhost:8000/web/index.bootstrap.initialize.dart.js, line 1: unreachable code after return statement
JavaScript warning: http://localhost:8000/web/index.bootstrap.initialize.dart.js, line 1: unreachable code after return statement
JavaScript warning: http://localhost:8000/web/index.bootstrap.initialize.dart.js line 3213 > Function, line 1: unreachable code after return statement
JavaScript warning: http://localhost:8000/web/index.bootstrap.initialize.dart.js, line 1: unreachable code after return statement
JavaScript warning: http://localhost:8000/web/index.bootstrap.initialize.dart.js line 3213 > Function, line 1: unreachable code after return statement
JavaScript warning: http://localhost:8000/web/index.bootstrap.initialize.dart.js, line 1: unreachable code after return statement
JavaScript warning: http://localhost:8000/web/index.bootstrap.initialize.dart.js line 3213 > Function, line 1: unreachable code after return statement
JavaScript warning: http://localhost:8000/web/index.bootstrap.initialize.dart.js, line 1: unreachable code after return statement
JavaScript warning: http://localhost:8000/web/index.bootstrap.initialize.dart.js line 3213 > Function, line 1: unreachable code after return statement
This is a Test: 'Polymer Todo App'
true
[Child 7828] ###!!! ABORT: Aborting on channel error.: file c:/builds/moz2_slave/m-rel-w32-00000000000000000000/build/src/ipc/glue/MessageChannel.cpp, line 2027

org.openqa.selenium.remote.UnreachableBrowserException: Error communicating with the remote browser. It may have died.
Build info: version: 'unknown', revision: 'c7b525d', time: '2016-09-01 14:57:44 -0700'
System info: host: 'CHI-CS-55DXX52', ip: '10.60.68.15', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_77'
Driver info: driver.version: RemoteWebDriver
Capabilities [{rotatable=false, raisesAccessibilityExceptions=false, appBuildId=20160623154057, version=, platform=XP, proxy={}, command_id=1, specificationLevel=0, acceptSslCerts=false, browserVersion=47.0.1, platformVersion=6.1, XULappId={ec8030f7-c20a-464f-9b0e-13a3a9e97384}, browserName=Firefox, takesScreenshot=true, takesElementScreenshot=true, platformName=Windows_NT, device=desktop}]
Session ID: 7431bbcb-b619-48dc-b4ca-ccc14eef1ce8

at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:618)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:654)
at org.openqa.selenium.remote.RemoteWebDriver.quit(RemoteWebDriver.java:493)
at com.polymerdart.webdriver.MyFirstTest.testSuite(MyFirstTest.java:36)
at com.polymerdart.webdriver.MyFirstTest.testWithFirefox(MyFirstTest.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.lang.IllegalStateException: UnixUtils may not be used on Windows
at org.openqa.selenium.os.ProcessUtils.getProcessId(ProcessUtils.java:188)
at org.openqa.selenium.os.UnixProcess$SeleniumWatchDog.getPID(UnixProcess.java:222)
at org.openqa.selenium.os.UnixProcess$SeleniumWatchDog.access$300(UnixProcess.java:201)
at org.openqa.selenium.os.UnixProcess.destroy(UnixProcess.java:132)
at org.openqa.selenium.os.CommandLine.destroy(CommandLine.java:155)
at org.openqa.selenium.remote.service.DriverService.stop(DriverService.java:196)
at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:94)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:597)
... 31 more

Answer

To resolve this, I did the following:

static Map<String, WebDriver> driverMap = new HashMap<String,WebDriver>();

@BeforeClass
public static void initDriverMap(){
    driverMap.put("chrome", new ChromeDriver(DesiredCapabilities.chrome()));
    driverMap.put("firefox", new FirefoxDriver(DesiredCapabilities.firefox()));
}

@AfterClass
public static void cleanUp(){

    Iterator it = driverMap.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry<String,WebDriver> pair = (Map.Entry)it.next();
        pair.getValue().close();
        try {
            pair.getValue().quit();
        }catch(Exception e){}
    }
}

@Test
public void testWithChrome(){
    WebDriver driver = driverMap.get("chrome");
    testSuite(driver);
}

@Test
public void testWithFirefox(){
    WebDriver driver = driverMap.get("firefox");
    testSuite(driver);
}

public void testSuite(WebDriver driver){
    driver.navigate().to("http://localhost:8000/web/");
    Assert.assertTrue("title should start with Polymer Todo App",
            driver.getTitle().startsWith("Polymer Todo App"));

    System.out.printf("This is a Test: '%s'\n", driver.getTitle());
    System.out.println(driver.getTitle().startsWith("Polymer Todo App"));

// driver.close(); // driver.quit(); }

At first, i ran it without the try-catch in the @AfterClass and it executed all teh tasks correctly, but then failed on the quit. Since I am not testing the quit, I put a try-catch around it to supress it, since it seems that now Mozilla is firing as needed.

Essentially, when i would run the class to test, it would first put in the test case drivers. I didnt want to automate the testing since i needed functions to test. I can update this later.

in the Afterclass, I would run cleanup and close all of the drivers which were open. There is 1 downside and it is that all drivers remain open until the tests are all completed. While I didnt want to do this, I didnt want to put a try-catch in my actual testSuite.

After working on a few variations, I found that the best result, leading to less browsers open at a given point in time would be as follows:

public void testWithChrome(){
    WebDriver driver =  new ChromeDriver(DesiredCapabilities.chrome());
    testSuite(driver);
    driver.close();
    try {
        driver.quit();
    }catch(Exception e){
        System.out.println("Driver error preventing from Quitting.");
    }
}

@Test
public void testWithFirefox(){
    WebDriver driver = new FirefoxDriver(DesiredCapabilities.firefox());
    testSuite(driver);
    driver.close();
    try {
        driver.quit();
    }catch(Exception e){
        System.out.println("Driver error preventing from Quitting.");
    }
}

public void testSuite(WebDriver driver){
    driver.navigate().to("http://localhost:8000/web/");
    Assert.assertTrue("title should start with Polymer Todo App",
            driver.getTitle().startsWith("Polymer Todo App"));

    System.out.printf("This is a Test: '%s'\n", driver.getTitle());
    System.out.println(driver.getTitle().startsWith("Polymer Todo App"));
}

Since I want to close and quit drivers in the same scope. That way there are no test cases shutting down browsers, as much as it running its entire suite and then closing when done with that function.

Comments