Poly Driver: A Phantom Band-Aid for Geb

An introduction to the Poly Driver plugin..

Object Partners

The Problem:

You have an extensive suite of Geb functional tests running against Firefox and it takes a long time to run. You switch your tests over to PhantomJS; now they run twice as fast!

But five percent of the tests intermittently fail. After spending a few hours trying to figure it out, you still don’t know why they are failing — just that they fail sometimes, and you don’t want to spend the next week trying to figure out a workaround. As it stands, it’s not practical to switch to PhantomJS at this time.

A Solution:

Why not use both? Add the Poly Driver plugin to your project and configure it in GebConfig.groovy:

driver = {  

   FirefoxDriver firefoxDriver = new FirefoxDriver()
   PhantomJSDriver phantomJSDriver = getPhantomDriver()  

   new PolyDriver(mainDriver: phantomJSDriver, alternateDrivers: ['firefox' : firefoxDriver])
}  

private PhantomJSDriver getPhantomDriver() {
   // see Tomás Lin’s excellent blog post on configuring drivers for Geb:
   // http://fbflex.wordpress.com/2013/03/18/how-to-configure-webdriver-in-grails-for-your-geb-tests/
}

Change the class inheritance of your problem test and annotate it:

class MyGebSpecCase extends GebReportingSpec {
  ...
}

becomes

import com.polydriver.spec.PolyDriverGebReportingSpec  

@PreferredDriver('firefox')
class MyGebSpecCase extends PolyDriverGebReportingSpec {
  ...
}

When you run your tests, you will see a Firefox window open but only the FooGebSpecCase (and any others with the @PreferredDriver(‘firefox’) annotation) will use it. The rest of your tests will run quickly in PhantomJS.

The driver allows you to specify as many drivers as you want — you can even declare multiple instances of the same browser, so if you want to run a subset of tests against different Firefox profiles, you can do that:

driver = {
   FirefoxDriver firefoxDriver = new FirefoxDriver()
   FirefoxProfile ffProfile = new FirefoxProfile()
   // setup the other profile
   FirefoxDriver altFirefoxDriver = new FirefoxDriver(ffProfile)
   PhantomJSDriver phantomJSDriver = getPhantomDriver()  

   new PolyDriver(
         mainDriver:       phantomJSDriver,
         alternateDrivers: [
               'firefox':  firefoxDriver,
               'ff-alt':   altFirefoxDrive
         ]
   )
}

Hopefully this eases the pain of transitioning your test suites to PhantomJS.

Share this Post

Related Blog Posts

JVM

HTML-Encoding UTF-8 Characters

April 24th, 2013

It happens sometimes that a web page isnt using UTF-8, but theres a need to display UTF-8 data. Thankfully HTML offers encoding that allows displaying any arbitrary UTF-8 characters.

Object Partners
JVM

Refactoring? Check your settings!

April 16th, 2013

When refactoring, be sure to check your application settings as they may no longer make sense.

Brendon Anderson
JVM

Validating Grails Configurations

April 2nd, 2013

When externalizing grails app configurations for multiple environments I want to ensure values are provided for all the required/expected properties. So I wrote a plugin to help.

Object Partners

About the author