在Specflow示例中,我已经看到了几种实例化Web驱动程序的方法。
Dispose
方法中对其进行处理为什么这么恐怖?原因1场景不等于1个步骤定义类,因为某些步骤仅在功能之间共享,并且实例化了1个以上的Web驱动程序。示例:https://www.softwaretestinghelp.com/specflow-and-selenium/
[BeforeScenario]
中创建它,并在[AfterScenario]
中销毁int 它不适用于并行执行(根据作者)。 https://github.com/AutomateThePlanet/AutomateThePlanet-Learning-Series/tree/master/Specflow-Series/ExtendTestExecutionWorkflowUsingHooks
问题:如何使用NUnit在Specflow UI测试解决方案中管理WebDriver
实例?在何处,何时初始化,何时何地销毁以及如何在页面对象模型和步骤定义类中对其进行访问?
答案 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,因此它们共享静态类状态,这意味着每种方案都尝试使用相同的浏览器实例。