SpecFlow + Selenium-WebDriver:跨步骤共享WebDriver?

时间:2012-10-26 18:15:05

标签: selenium webdriver bdd specflow

假设我有一个使用两个不同类中包含的步骤的场景。他们是否有办法在不经过IWebDriver的情况下处理同一ScenarioContext.Current["webdriverVariableName"]个实例?

那太难看了。有更清洁的方式吗?

我打算创建一个具有public static IWebDriver属性的类,该属性在每个场景的开头都被分配,所以我的所有步骤都可以引用它,但是当我开始时我认为这不会起作用并行运行它们,因为每个场景都会覆盖全局驱动程序。

4 个答案:

答案 0 :(得分:6)

Specflow提供依赖注入机制,因此您可以在步骤中注入Web驱动程序实例。

请参阅https://github.com/techtalk/SpecFlow/wiki/Context-Injection

请参阅“Avanced选项”部分。

答案 1 :(得分: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;
        }
    }
    
  3. 您的步骤现在可以访问完全实例化的WebDriver对象

答案 2 :(得分: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);
        }
    }
}
等等......

答案 3 :(得分:0)

只需创建一个带有静态属性的新分离类,即可返回驱动程序:

static class DriverProvider
{
    private static IWebDriver _driver;
    public static IWebDriver Driver
    {
        get
        {
            if (_driver == null)
            {
                _driver = new ChromeDriver();
                _driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(40);
                _driver.Manage().Window.Maximize();
            }
            return _driver;
        }
    }

}

每次您都需要对驱动程序做一些事情,只需以这种方式调用它即可:

SomeMethod(DriverProvider.Driver);
//
IWebelement e = DriverProvider.Driver.FindElement(By.XPath("you_XPath"));
e.Click();
// etc etc etc