2012-10-26 74 views
2

假設我有一個使用兩個不同類中包含的步驟的場景。如果沒有經過ScenarioContext.Current["webdriverVariableName"],他們是否有辦法處理相同的IWebDriver實例?SpecFlow + Selenium-WebDriver:跨步共享WebDriver?

這太難看了。有更清潔的方法嗎?

我打算在每個場景開始時分配一個public static IWebDriver屬性,以便我所有的步驟都可以引用它,但我不認爲這會在我開始運行它時起作用同時,每個方案都會覆蓋全球的驅動程序。

回答

0

我的測試,這是目前工作正常運行多線程webdriver的情況下,使用的是基礎的步驟定義類來保存驅動程序實例。所有的步驟定義從這個繼承,因此驅動程序可以提供給所有的步驟..

namespace Project.StepDefinitions 
{ 
    [Binding] 
    public class BaseStepDefinitions 
    { 
     private const string CurrentPageKey = "Current.Page"; 
     public static IWebDriver Driver { get; set; } 

     protected LogonPageModel LogonPage 
     { 
      get { return (LogonPageModel)ScenarioContext.Current[CurrentPageKey]; } 
      set { ScenarioContext.Current[CurrentPageKey] = value; } 
     } 

     protected RegisterPageModel RegisterPage 
     { 
      get { return (RegisterPageModel)ScenarioContext.Current[CurrentPageKey]; } 
      set { ScenarioContext.Current[CurrentPageKey] = value; } 
     } 
    } 
} 

//////////////

namespace SpecDriver.StepDefinitions 
{ 
    [Binding] 
    public class LoginSteps : BaseStepDefinitions 
    { 
     [Given(@"I navigate to the homepage")] 
     public void GivenINavigateToTheHomepage() 
     { 
      Driver.Navigate().GoToUrl(SettingsManager.BaseUrl); 
     } 
    } 
} 

等等...

4

使用Specflow我剛剛開始,但是這似乎工作;

  1. 創建類這需要IObjectContainer作爲構造並具有BeforScenario方法創建的webdriver實例;

    [Binding] 
    public class WebDriverSupport 
    { 
        private readonly IObjectContainer _objectContainer; 
    
        public WebDriverSupport(IObjectContainer objectContainer) 
        { 
         _objectContainer = objectContainer; 
        } 
    
        [BeforeScenario] 
        public void InitializeWebDriver() 
        { 
         var webDriver = DriverFactory.CreateDriver(); 
         _objectContainer.RegisterInstanceAs<RemoteWebDriver>(webDriver); 
        } 
    } 
    
  2. 創建步班,內搭RemoteWebDriver一個構造函數;

    [Binding] 
    public class POCSteps 
    { 
        private readonly IdlWebDriver _driver; 
    
        public POCSteps(IdlWebDriver driver) 
        { 
         _driver = driver; 
        } 
    } 
    

你的步驟步驟現在將有機會獲得一個完全實例化對象的webdriver