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 {
  ...
}

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.

About the Author

Object Partners profile.
Leave a Reply

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

Related Blog Posts
AWS Cloud HSM, Docker and NGINX
There is quite a bit of easily searchable content on the security benefits of leveraging a Hardware Security Module to manage cryptographic keys, so I will leave that to the scope of another article. The […]
Google Professional Machine Learning Engineer Exam 2021
Exam Description A Professional Machine Learning Engineer designs, builds, and productionizes ML models to solve business challenges using Google Cloud technologies and knowledge of proven ML models and techniques. The ML Engineer is proficient in all aspects […]
Designing Kubernetes Controllers
There has been some excellent online discussion lately around Kubernetes controllers, highlighted by an excellent Speakerdeck presentation assembled by Tim Hockin. What I’d like to do in this post is explore some of the implications […]
React Server Components
The React Team recently announced new work they are doing on React Server Components, a new way of rendering React components. The goal is to create smaller bundle sizes, speed up render time, and prevent […]