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.

Related Blog Posts
Natively Compiled Java on Google App Engine
Google App Engine is a platform-as-a-service product that is marketed as a way to get your applications into the cloud without necessarily knowing all of the infrastructure bits and pieces to do so. Google App […]
Building Better Data Visualization Experiences: Part 2 of 2
If you don't have a Ph.D. in data science, the raw data might be difficult to comprehend. This is where data visualization comes in.
Unleashing Feature Flags onto Kafka Consumers
Feature flags are a tool to strategically enable or disable functionality at runtime. They are often used to drive different user experiences but can also be useful in real-time data systems. In this post, we’ll […]
A security model for developers
Software security is more important than ever, but developing secure applications is more confusing than ever. TLS, mTLS, RBAC, SAML, OAUTH, OWASP, GDPR, SASL, RSA, JWT, cookie, attack vector, DDoS, firewall, VPN, security groups, exploit, […]