C# – Run Selenium tests in multiple browsers with C#

c++seleniumselenium-webdriver

I have a method that creates 2 remote web drivers. one with chrome and another with firefox:

Driver.cs

 public class Driver
{

    public static IWebDriver Instance { get; set; }

    public static void Initialize()
    {
        DesiredCapabilities[] browsers = {DesiredCapabilities.Firefox(),DesiredCapabilities.Chrome()};
       foreach (DesiredCapabilities browser in browsers)
        {
            if (browser == DesiredCapabilities.Chrome()) 
                {
                var browser = DesiredCapabilities.Chrome();
                System.Environment.SetEnvironmentVariable("webdriver.chrome.driver", "C:/Users/jm/Documents/Visual Studio 2013/Projects/VNextAutomation - Copy - Copy (3)/packages/WebDriverChromeDriver.2.10/tools/chromedriver.exe");
                ChromeOptions options = new ChromeOptions() { BinaryLocation = "C:/Users/jm/AppData/Local/Google/Chrome/Application/chrome.exe" };
                browser.SetCapability(ChromeOptions.Capability, options);
                Console.Write("Testing in Browser: " + browser.BrowserName);

                Instance = new RemoteWebDriver(new Uri("http://127.0.0.1:4444/wd/hub"), browser);

            } else {
               Console.Write("Testing in Browser: "+ browser.BrowserName);
               Instance = new RemoteWebDriver(new Uri("http://127.0.0.1:4444/wd/hub"), browser);
           }   
        }
        Instance.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(15));
    }

Then I have a Test class:

[TestClass]
public class LoginTests
{
    [TestInitialize]
    public void Init()
    {
       Driver.Initialize();
    }

    [TestMethod]
    public void Failed_login()
    {
        LoginPage.GoTo();
        LoginPage.LoginAs("user").WithPassword("pass").WithDatasource("db").Login();

        Assert.IsTrue(LoginFail.IsAt, "Login failure is incorrect");
    }


    [TestMethod]
    public void Admin_User_Can_Login()
    {
        LoginPage.GoTo();
        LoginPage.LoginAs("user").WithPassword("pass").WithDatasource("db").Login();

        Assert.IsTrue(HomePage.IsAt, "Failed to login.");
    }

    [TestCleanup]
    public void Cleanup()
    {
      Driver.Close();

    }
}

}

The problem is when Driver.Intialize gets called it doesn't run both chrome and firefox. What I want to happen is that when the Init method gets called it starts both browsers and runs the Test Methods in each browser.

Best Solution

The way I am currently doing this is with NUnit. I had the same problem and could not find a good way to do it with MSTest.

What I am doing would be:

As you can see I just create a new TestFixture for each browser.

[TestFixture(typeof(ChromeDriver))]
[TestFixture(typeof(InternetExplorerDriver))]
[TestFixture(typeof(FirefoxDriver))]

public class LoginTests<TWebDriver> where TWebDriver : IWebDriver, new()
{


[SetUp]
public void Init()
{
   Driver.Initialize<TWebDriver>();
}

[Test]
public void Failed_login()
{
    LoginPage.GoTo();
    LoginPage.LoginAs("user").WithPassword("pass").WithDatasource("db").Login();

    Assert.IsTrue(LoginFail.IsAt, "Login failure is incorrect");
}


[Test]
public void Admin_User_Can_Login()
{
    LoginPage.GoTo();
    LoginPage.LoginAs("user").WithPassword("pass").WithDatasource("db").Login();

    Assert.IsTrue(HomePage.IsAt, "Failed to login.");
}

[TearDown]
public void Cleanup()
{
  Driver.Close();

}
}
}

Driver Class

 public class Driver<TWebDriver> where TWebDriver : IWebDriver, new()
 {

    public static IWebDriver Instance { get; set; }

    public static void Initialize()
    {
        if (typeof(TWebDriver) == typeof(ChromeDriver))
        {


         var browser = DesiredCapabilities.Chrome();
                System.Environment.SetEnvironmentVariable("webdriver.chrome.driver", "C:/Users/jm/Documents/Visual Studio 2013/Projects/VNextAutomation - Copy - Copy (3)/packages/WebDriverChromeDriver.2.10/tools/chromedriver.exe");
                ChromeOptions options = new ChromeOptions() { BinaryLocation = "C:/Users/jm/AppData/Local/Google/Chrome/Application/chrome.exe" };
                browser.SetCapability(ChromeOptions.Capability, options);
                Console.Write("Testing in Browser: " + browser.BrowserName);



                Instance = new RemoteWebDriver(new Uri("http://127.0.0.1:4444/wd/hub"), browser);

            } else {
               Console.Write("Testing in Browser: "+ browser.BrowserName);
               Instance = new RemoteWebDriver(new Uri("http://127.0.0.1:4444/wd/hub"), browser);
           }   
        }
        Instance.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(15));
    }
}

I have tried to fit it around your code.