C# 在BeforeFeature方法中初始化webdriver

C# 在BeforeFeature方法中初始化webdriver,c#,selenium,specflow,C#,Selenium,Specflow,我有以下问题。我需要使用上下文注入在specflow BeforeFeature方法中注册我的webdriver实例,但该方法必须是静态的。我有一个错误,我的全局容器对象必须是静态的。有没有办法在静态方法中使用这个上下文注入 这是我的密码: [Binding] public class SpecflowHooks { private readonly IObjectContainer container; public SpecflowHooks(IObjectContaine

我有以下问题。我需要使用上下文注入在specflow BeforeFeature方法中注册我的webdriver实例,但该方法必须是静态的。我有一个错误,我的全局容器对象必须是静态的。有没有办法在静态方法中使用这个上下文注入

这是我的密码:

[Binding]
public class SpecflowHooks
{
    private readonly IObjectContainer container;

    public SpecflowHooks(IObjectContainer container)
    {
        this.container = container;
    }

    [BeforeFeature]
    public static void OneTime()
    {
        ChromeOptions options = new ChromeOptions();
        options.AddArgument("--ignore-ssl-errors=yes");
        options.AddArgument("--ignore-certificate-errors");
        ChromeDriver driver = new ChromeDriver();
        driver.Manage().Window.Maximize();
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);

        container.RegisterInstanceAs<IWebDriver>(driver);
    }

    [BeforeScenario]
    public void SetUp()
    {

    }

    [AfterScenario]
    public void TearDown()
    {

    }

    [AfterFeature]
    public static void FeatureTearDown()
    {
        IWebDriver driver = container.Resolve<IWebDriver>();

        driver.Close();
        driver.Dispose();
    }
}
[绑定]
公共类specflowhook
{
私有只读IObjectContainer;
公共SpecflowHooks(IObjectContainer)
{
this.container=容器;
}
[之前特写]
公共静态void OneTime()
{
ChromeOptions选项=新的ChromeOptions();
options.AddArgument(“--ignoressl errors=yes”);
options.AddArgument(“--ignore certificate errors”);
ChromeDriver驱动程序=新的ChromeDriver();
driver.Manage().Window.Maximize();
driver.Manage().Timeouts().ImplicitWait=TimeSpan.FromSeconds(30);
集装箱登记员(司机);
}
[场景之前]
公共作废设置()
{
}
[赛后]
公共无效拆卸()
{
}
[后记]
公共静态无效功能拆卸()
{
IWebDriver-driver=container.Resolve();
driver.Close();
driver.Dispose();
}
}

我假设您只想对每个功能初始化一次web驱动程序,并为功能中的每个场景重用现有的web驱动程序对象

正如您所注意到的,BeforeFeature挂钩是静态的。您仍然可以使用它来初始化web驱动程序,但可以将其分配给钩子类上的静态字段。然后在Before场景中,向依赖项注入容器注册静态web驱动程序对象:

[Binding]
public class SpecflowHooks
{
    private static IWebDriver driver;
    private readonly IObjectContainer container;

    public SpecflowHooks(IObjectContainer container)
    {
        this.container = container;
    }

    [BeforeFeature]
    public static void OneTime()
    {
        ChromeOptions options = new ChromeOptions();
        options.AddArgument("--ignore-ssl-errors=yes");
        options.AddArgument("--ignore-certificate-errors");

        driver = new ChromeDriver(options); // <-- don't forget to pass 'options' here
        driver.Manage().Window.Maximize();
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);

    }

    [BeforeScenario]
    public void SetUp()
    {
        container.RegisterInstanceAs<IWebDriver>(driver);
    }

    [AfterScenario]
    public void TearDown()
    {
    }

    [AfterFeature]
    public static void FeatureTearDown()
    {
        if (driver == null)
            return;

        driver.Close();
        driver.Dispose();
        driver = null;
    }
}
[绑定]
公共类specflowhook
{
专用静态IWebDriver;
私有只读IObjectContainer;
公共SpecflowHooks(IObjectContainer)
{
this.container=容器;
}
[之前特写]
公共静态void OneTime()
{
ChromeOptions选项=新的ChromeOptions();
options.AddArgument(“--ignoressl errors=yes”);
options.AddArgument(“--ignore certificate errors”);

driver=new ChromeDriver(options);//您还可以使用FeatureContext来存储WebDriver的实例。您可以将其作为方法的参数获取。