我将Specflow与NUnit和Selenium结合使用,并希望在所有测试中共享驱动程序实例。我可以使用FeatureContext达到功能级别,但是看不到所有测试的任何内容。我知道这可能不是正确的方法,但我想知道是否有办法。
请帮助提供示例。
谢谢
有几种方法可以做到这一点。此页面涵盖了大多数
我个人可能要做的是定义一个SeleniumContext类,并在所有Step类的构造函数中都需要该类,然后告诉SpecFlow的IOC在每种情况下都使用相同的实例:
SeleniumContext
首先创建用于保存硒驱动程序实例的类
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挂钩保存相同的实例:
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; } }