Как перезапустить браузер в середине теста и не потерять инъекцию зависимостей? - PullRequest
0 голосов
/ 11 марта 2020

Я запускаю новый браузер Chrome xor Firefox в начале теста и регистрирую экземпляр с помощью BoDi. Мне нужно перезапустить браузер в середине теста. Я могу сделать это, но я не могу перерегистрировать экземпляр в BoDi, поэтому старый WebDriver будет введен в следующих шагах. Я не могу использовать AutoFac, потому что он не поддерживает Specflow 3, и я не нашел другого контейнера DI, который поддерживает.

Единственное решение, которое я нашел, это разделить тест на две части, чтобы браузер будет перезапущен естественно, однако это взломать.

1 Ответ

1 голос
/ 11 марта 2020

Создайте новый класс, который обернет ваш веб-драйвер, и передайте его вашим определениям шагов. Этот класс предоставит метод для перезапуска браузера. Поскольку все другие определения шагов должны быть переданы этой обертке, они всегда должны получать веб-драйвер от этой обертки, что исключает необходимость перерегистрации его в 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();
    }
}
...