SpecFlow&x2B;Selenium WebDriver:跨步骤共享WebDriver?

SpecFlow&x2B;Selenium WebDriver:跨步骤共享WebDriver?,selenium,webdriver,bdd,specflow,Selenium,Webdriver,Bdd,Specflow,假设我有一个场景,使用两个不同类中包含的步骤。是否有一种方法可以让它们都拥有相同的IWebDriver实例的句柄,而不必经过ScenarioContext.Current[“webdriverVariableName”] 太难看了。有没有更干净的方法 我打算创建一个带有公共静态IWebDriver属性的类,该属性在每个场景开始时分配,以便我的所有步骤都可以引用它,但我认为当我开始并行运行它们时,这不会起作用,因为每个场景都会覆盖全局驱动程序。Specflow提供了依赖项注入机制,因此您可以在步骤

假设我有一个场景,使用两个不同类中包含的步骤。是否有一种方法可以让它们都拥有相同的
IWebDriver
实例的句柄,而不必经过
ScenarioContext.Current[“webdriverVariableName”]

太难看了。有没有更干净的方法


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

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


请参阅“Avanced options”部分。

我的测试目前运行良好,运行多线程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);
        }
    }
}

等等。

我刚刚开始使用Specflow,但这似乎有效

  • 创建一个类,该类以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);
        }
    }
    

  • 您的步骤现在可以访问完全实例化的WebDriver对象

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

    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
    

    对不起,我不太明白这是怎么回事。objectContainer在哪里分配?除非类被继承,否则它不是空的吗?嗨,我已经5年没做过这个了,所以真的不记得了。道歉。我假设specflow测试的执行处理创建?
    SomeMethod(DriverProvider.Driver);
    //
    IWebelement e = DriverProvider.Driver.FindElement(By.XPath("you_XPath"));
    e.Click();
    // etc etc etc