如何正确管理和访问Webdriver实例以避免并行执行测试的问题?

时间:2019-10-15 08:39:25

标签: .net selenium design-patterns specflow

在Specflow示例中,我已经看到了几种实例化Web驱动程序的方法。

  1. 在步骤定义类中创建它,并在该类的Dispose方法中对其进行处理

为什么这么恐怖?原因1场景不等于1个步骤定义类,因为某些步骤仅在功能之间共享,并且实例化了1个以上的Web驱动程序。示例:https://www.softwaretestinghelp.com/specflow-and-selenium/

  1. 在钩子[BeforeScenario]中创建它,并在[AfterScenario]中销毁int

它不适用于并行执行(根据作者)。 https://github.com/AutomateThePlanet/AutomateThePlanet-Learning-Series/tree/master/Specflow-Series/ExtendTestExecutionWorkflowUsingHooks

问题:如何使用NUnit在Specflow UI测试解决方案中管理WebDriver实例?在何处,何时初始化,何时何地销毁以及如何在页面对象模型和步骤定义类中对其进行访问?

1 个答案:

答案 0 :(得分:2)

您需要使用SpecFlow随附的依赖项注入框架。在#{1}中创建它并在[BeforeScenario]中销毁它的选项#2是正确的方法,但是您需要在依赖注入框架中注册[AfterScenario]对象:

IWebDriver

您的步骤定义需要接受IWebDriver对象作为构造函数参数。您甚至还可以在DI框架中注册页面对象。

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

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

    [BeforeScenario]
    public void CreateWebDriver()
    {
        FirefoxDriver driver = new FirefoxDriver();

        // Make 'driver' available for DI
        container.RegisterInstanceAs<IWebDriver>(driver);
    }

    [AfterScenario]
    public void DestroyWebDriver()
    {
        var driver = container.Resolve<IWebDriver>();

        if (driver != null)
        {
            driver.Quit();
            driver.Dispose();
        }
    }
}

在您引用的GitHub项目中,Web驱动程序对象被初始化为静态属性。这就是为什么该代码示例不能用于并行测试的原因。听起来所有正在执行的方案都使用相同的AppDomain,因此它们共享静态类状态,这意味着每种方案都尝试使用相同的浏览器实例。