Sharing same selenium WebDriver between step definition files Sharing same selenium WebDriver between step definition files selenium selenium

Sharing same selenium WebDriver between step definition files


I reccomend you to use pico-container as a dependency injection framework to use with cucumber-jvm.

With PicoContainer, you can have a 'base' class with the instance of WebDriver, and then pass this base class automactically to any other class. Or even you could pass directly the web driver if you prefer.

<dependency>    <groupId>info.cukes</groupId>    <artifactId>cucumber-picocontainer</artifactId>    <version>1.2.3</version>    <scope>test</scope></dependency>

Example:

Base class with the instance of WebDriver:

public class ContextSteps {   private static boolean initialized = false;   private WebDriver driver;   @Before   public void setUp() throws Exception {      if (!initialized) {         // initialize the driver         driver = = new FirefoxDriver();         initialized = true;      }   }   public WebDriver getDriver() {      return driver;   }}

Other class who access webDriver through pico-container DI.

public class OtherClassSteps {   private ContextSteps contextSteps;   // PicoContainer injects class ContextSteps   public OtherClassSteps (ContextSteps contextSteps) {      this.contextSteps = contextSteps;   }   @Given("^Foo step$")   public void fooStep() throws Throwable {      // Access WebDriver instance      WebDriver driver = contextSteps.getDriver();   }}

Hope it helps.


This question is old, and I left the project shortly after asking this question, but I went back and looked at the code we put in place (using the singleton pattern) and this is what we ended up with. I forget exactly why we couldn't use pico-container (it was possibly an organizational constraint) but if you can use extra libraries I remember that solution worked well.

I will leave that as the accepted answer but hopefully this solution is useful for those who find themselves in a similar position that I was in a few years ago.

public class TestingBase {    private static TestingBase instance;    private static WebDriver driver;    private static Thread CLOSE_DRIVER = new Thread() {        @Override        public void run() {            driver.close();        }    };    static {        Runtime.getRuntime().addShutdownHook(CLOSE_DRIVER);    }    private TestingBase() {        DesiredCapabilities desiredCapabilities = new DesiredCapabilities();        desiredCapabilities.setJavascriptEnabled(true);        desiredCapabilities.setCapability("takesScreenshot", false);        desiredCapabilities.setCapability("handlesAlerts", true);        desiredCapabilities.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, new String[]{                "--web-security=false",                "--ssl-protocol=TLSv1",                "--ignore-ssl-errors=true",                "--webdriver-loglevel=ERROR",                "--webdriver-logfile=/var/log/phantomjs/ghostrdriver.log"        });        desiredCapabilities.setCapability("elementScrollBehavior",true);        driver = new PhantomJSDriver(desiredCapabilities);    }    public static TestingBase getTestingBase() {        if (instance == null) {            instance = new TestingBase();        }        return instance;    }    public static WebDriver getDriver() {        return getTestingBase().driver;    }}