NUnit Specflow how to share a class instance for all tests NUnit Specflow how to share a class instance for all tests selenium selenium

NUnit Specflow how to share a class instance for all tests


There are a few ways to do this. Most are covered on this page

What I personally would probably do is define a SeleniumContext class and require this class in all my Step class constructors, then tell SpecFlow's IOC to use the same instance in every scenario:

First create the class to hold the selenium driver instance

public class SeleniumContext{     public SeleniumContext()     {          //create the selenium context          WebDriver = new ...create the flavour of web driver you want     }     public IWebDriver WebDriver{get; private set;} }

then setup the IOC to return the same instance every time

[Binding]public class BeforeAllTests{    private readonly IObjectContainer objectContainer;    private static SeleniumContext seleniumContext ;    public BeforeAllTests(IObjectContainer container)    {        this.objectContainer = container;    }    [BeforeTestRun]    public static void RunBeforeAllTests()    {        seleniumContext = new SeleniumContext();     }    [BeforeScenario]    public void RunBeforeScenario()    {                    objectContainer.RegisterInstanceAs<SeleniumContext>(seleniumContext );    }}

Then ensure your step classes always ask for the context in their constructors (you need to do this in every step class you have)

[Bindings]public class MySteps{    private SeleniumContext seleniumContext;    public MyClass(SeleniumContext seleniumContext)    {         //save the context so you can use it in your tests         this.seleniumContext = seleniumContext;    }    //then just use the seleniumContext.WebDriver in your tests}

alternatively if you are already storing the instance in the feature context then you can just use the BeforeFeature hook to save the same instance:

[Binding]public class BeforeAllTests{    private static WebDriver webDriver;    [BeforeTestRun]    public static void RunBeforeAllTests()    {        webDriver = new WebDriver();     }    [BeforeFeature]    public static void RunBeforeFeature()    {        FeatureContext["WebDriver"] = webDriver;     }}