我正在使用Specflow与NUnit和Selenium,并希望在所有测试中共享驱动程序的实例。 我可以使用FeatureContext执行此功能,但无法查看所有测试的任何内容。我知道这可能不是正确的方法,但我想知道是否有办法。
请帮助举例。
由于
答案 0 :(得分:14)
有几种方法可以做到这一点。大部分内容都在this page
上我个人可能会做的是定义一个SeleniumContext
类并在我的所有Step类构造函数中需要这个类,然后告诉SpecFlow的IOC在每个场景中使用相同的实例:
首先创建用于保存selenium驱动程序实例的类
public class SeleniumContext
{
public SeleniumContext()
{
//create the selenium context
WebDriver = new ...create the flavour of web driver you want
}
public IWebDriver WebDriver{get; private set;}
}
然后设置IOC以每次返回相同的实例
[Binding]
public class BeforeAllTests
{
private readonly IObjectContainer objectContainer;
private static SeleniumContext seleniumContext ;
public BeforeAllTests(IObjectContainer container)
{
this.objectContainer = container;
}
[BeforeTestRun]
public static void RunBeforeAllTests()
{
seleniumContext = new SeleniumContext();
}
[BeforeScenario]
public void RunBeforeScenario()
{
objectContainer.RegisterInstanceAs<SeleniumContext>(seleniumContext );
}
}
然后确保您的步骤类始终在其构造函数中询问上下文(您需要在每个步骤类中执行此操作)
[Bindings]
public class MySteps
{
private SeleniumContext seleniumContext;
public MyClass(SeleniumContext seleniumContext)
{
//save the context so you can use it in your tests
this.seleniumContext = seleniumContext;
}
//then just use the seleniumContext.WebDriver in your tests
}
或者,如果您已经将实例存储在要素上下文中,那么您只需使用BeforeFeature
挂钩来保存相同的实例:
[Binding]
public class BeforeAllTests
{
private static WebDriver webDriver;
[BeforeTestRun]
public static void RunBeforeAllTests()
{
webDriver = new WebDriver();
}
[BeforeFeature]
public static void RunBeforeFeature()
{
FeatureContext["WebDriver"] = webDriver;
}
}