How to share the webdriver instance between TestThreadContainer and FeatureContainer in a specflow project?

Viewed 39

In the specflow hook file, I have to share the webdriver instance across multiple containers like TestThreadContainer, FeatureContainer and ScenarioContainer.

In the below code, I'm not able to share webDriverManager instance between BeforeTestRun (TestThreadContainer) and BeforeFeature (FeatureContainer). Driver details are not being available for BeforeFeature, so I'm getting an exception while executing the BeforeFeature block. Basically, I want to share data between two different containers, is that possible?

using Automation.authentication.Helper;
using Automation.core;
using Automation.core.Configuration;
using Automation.core.Helper;
using Automation.core.Pages;
using TechTalk.SpecFlow;
using Xunit.Abstractions;

namespace ecui_e2e.Hooks
{
  [Binding]
  public sealed class Hooks
  {   

    [BeforeTestRun]
    public static void BeforeTestRun(WebDriverManager webDriverManager)
    {
        webDriverManager.StartWebDriver();
    }

    [BeforeFeature]
    public static void BeforeFeatureRun(WebDriverManager webDriverManager)
    {
      if (!webDriverManager.IsWebDriverLoggedin(_testUserAccount))
      {
        var login = ConfigurationHelper.EnvironmentConfiguration.Login
        new LoginHelper(webDriverManager).LoginToSite(
        login.UserName,
        login.Password);
        webDriverManager.SetDriverLoggedIn(_testUserAccount);
      }
    }

    [AfterTestRun]
    public static void AfterTestRun(WebDriverManager webDriverManager)
    {
      webDriverManager.ReleaseWebDrivers();
    }
  }
}

Here is the WebDriverManager Class

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;

namespace Automation.core
{
  public class WebDriverManager
  {
    public string FeatureKey { get; set; }

    public string ActiveDriverKey;
    public static ConcurrentDictionary<string, bool> WebDriverLoginStatus { get; private set; } = new ConcurrentDictionary<string, bool>();

    public static readonly ConcurrentDictionary<string, IWebDriver> WebDrivers = new ConcurrentDictionary<string, IWebDriver>();
    public IWebDriver WebDriver { get; private set; }
    public WebDriverManager()
    {

    }
    public void SetDriverLoggedIn(string driverKey)
    {
      var featureDriverKey = driverKey;
      if (WebDriverLoginStatus.ContainsKey(featureDriverKey))
      {
        WebDriverLoginStatus[featureDriverKey] = true;
      }
      else
      {
        throw new Exception($"Missing driver for key { driverKey }");
      }
    }
    public void SwitchWebDriver(string driverKey)
    {
      this.StartWebDriver(driverKey);
    }
    public void StartWebDriver(string driverKey)
    {
      var featureDriverKey = driverKey;
      var env = ConfigurationHelper.EnvironmentConfiguration;
      if (!WebDrivers.ContainsKey(featureDriverKey))
      {
        var webDriver = new ChromeDriver();
        webDriver.Manage().Window.Size = new System.Drawing.Size(1920, 1080);
        webDriver.Navigate().GoToUrl(env.BaseUrl);
        WebDrivers.TryAdd(featureDriverKey, webDriver);
      }
      ActiveDriverKey = driverKey;
      if (!WebDriverLoginStatus.ContainsKey(featureDriverKey))
      {
        WebDriverLoginStatus.TryAdd(featureDriverKey, false);
      }

      WebDriver = WebDrivers.GetValueOrDefault(featureDriverKey);
    }
    public bool IsWebDriverLoggedin(string driverKey)
    {
      var isLoggedin = WebDriverLoginStatus.GetValueOrDefault(driverKey);
      return isLoggedin;
    }
    public void ReleaseWebDrivers()
    {
      WebDrivers.Keys.ToList().ForEach(key =>
      {
          IWebDriver webDriver;
          WebDrivers.Remove(key, out webDriver);
          webDriver.Quit();
          webDriver.Dispose();
      });

      WebDriverLoginStatus.Keys.ToList().ForEach(key =>
      {
          bool isLoggedIn;
          WebDriverLoginStatus.Remove(key, out isLoggedIn);
      });
    }
  }
}
0 Answers
Related