We’re currently building mobile views for our grails application using jQuery mobile and the Spring mobile plugin. As such, we wanted to add a set of mobile tests in Geb to run in parallel with our application’s functional tests.
In this post, I show how you can set up a separate webdriver profile for a subset of your spock/geb functional tests.
In order to specify a separate driver profile ( we’re setting an iPhone user agent in our tests ), we needed a way to mark the new tests we’re creating to use this separate profile.
Marcin Erdman suggested in the Geb mailing list that it is possible to use the Geb Configuration mechanism to accomplish this, but you would end up creating a new driver for each test, which we wanted to avoid.
After a little bit of tweaking, we came up with the following base class for our tests to extend.
import geb.spock.GebSpec import spock.lang.Shared import org.openqa.selenium.firefox.FirefoxProfile import org.openqa.selenium.firefox.FirefoxDriver class MobileSpeck extends GebSpec { @Shared def cachedDriver def setupSpec(){ // create a new firefox profile with an iPhone user agent and cache it FirefoxProfile profile = new FirefoxProfile(); profile.setPreference("general.useragent.override", 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.1'); cachedDriver = new FirefoxDriver( profile ) } def setup(){ // assign this as the default driver on the browser for each test browser.driver = cachedDriver } def cleanupSpec(){ // after running the spec, kill the driver cachedDriver.quit() } }
( Note, this code is for 1.3.7, you might need to change GebSpec to use Specification if you are using grails 2.0. )
Basically, we create a new firefox driver with the desired profile and cache it in memory.
When a new spec is ran extending this speck ( we use the base class speck so that spock won’t try to run it as a test ), it will be assigned the new cachedDriver and use it instead of the default Geb driver.
After adding this Speck, we are able to specify a test by just extending the class. I.e,
class iPhoneUserLoginSpec extends MobileSpeck { ... }
Time to ask the semi-unrelated question
What is this “@Shared” annotation.. The Googles aren’t helping and the suspense is killing me 🙂
It’s a spock field that says ‘share this stuff across test methods’ http://code.google.com/p/spock/wiki/SpockBasics
Pingback: Plugins Grails | Pearltrees
Pingback: » Blog Archive
Pingback: An Army of Solipsists » Blog Archive » This Week in Grails (2012-03)
Pingback: A Smattering of Selenium #76 « Official Selenium Blog
Pingback: Adding Mobile Views to your Grails Applications with JQuery Mobile: A Real Life Example | iPhone Developers
Pingback: Mobile web testing on your iPhone or iPad with Geb and Spock | Object Partners Inc
Very useful stuff found through a random Googlings.