Poly Driver: A Phantom Band-Aid for Geb

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 {


import com.polydriver.spec.PolyDriverGebReportingSpec

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.

About the Author

Object Partners profile.
Leave a Reply

Your email address will not be published. Required fields are marked *

Related Blog Posts
Waypoint and JVM
What are we doing here? We’re going to to run Waypoint to build a Clojure web application, deploy it, and release it on a URL. Along the way, we’re going to see how it interacts […]
Understanding Mutual TLS Options in the Public Cloud
When delivering an API over the public internet via a cloud provider, some organizations and frameworks require mutual TLS verification as a part of the interaction for that API. Mutual TLS can be used to […]
Performance Test Liquibase Update
When doing a liquibase update to a database if you’re having performance issues, it can be hard to find out which updates are causing problems. If you need to measure the time to apply each […]
TICK Stack Monitoring for the Non-Technical
TICK – Telegraf, Influx, Chronograf, and Kapacitor – is a method of monitoring your systems and applications. In this article, I discuss in non-technical terms what the difference is between TICK and Prometheus Grafana A […]