如何在测试过程中重启浏览器而不松散依赖注入?

How to restart browser in the middle of the test and not loose dependency injection?

我在测试开始时启动新的 Chrome xor Firefox 浏览器,我使用 BoDi 注册实例。我需要在测试过程中重新启动浏览器。

我可以,但我无法在 BoDi 中重新注册实例,因此旧的 WebDriver 将在后续步骤中注入。我不能使用 AutoFac,因为它不支持 Specflow 3,我也没有找到任何其他支持的 DI 容器。

我找到的唯一解决方案是将测试分为两部分,这样浏览器就会自然重启,但这很老套。

创建一个新的 class 来包装您的网络驱动程序,并将其传递给您的步骤定义。 class 将公开一个重新启动浏览器的方法。由于所有其他步骤定义都应该传递给这个包装器,因此它们应该始终从这个包装器中获取 Web 驱动程序,从而消除了向 BoDi 重新注册它的需要。

public class WebDriverManager
{
    private IWebDriver driver;

    public IWebDriver Driver
    {
        get
        {
            if (driver == null)
            {
                driver = new [Chrome|Firefox]Driver(...);
            }

            return driver;
        }
    }

    public void RestartBrowser()
    {
        driver.Quite();
        driver.Dispose();
        driver = null;
    }
}

并在BoDi注册:

[Binding]
public class SpecFlowSteps
{
    private IObjectContainer container;

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

    [BeforeScenario]
    public void RegisterWebDriverManager()
    {
        var manager = new WebDriverManager();

        container.Register(manager);
    }
}

以及步骤定义中的示例用法:

[Binding]
public class YourSteps
{
    private WebDriverManager driverManager;

    private IWebDriver Driver => driverManager.Driver;

    public YourSteps(WebDriverManager driverManager)
    {
        this.driverManager = driverManager;
    }

    [When(@"I restart the browser")]
    public void WhenIRestartTheBrowser()
    {
        // Or whatever you call the step
        driverManager.RestartBrowser();
    }
}