我正在尝试通过xUnit console runner并行执行大量的selenium测试。
这些已执行,我看到3个镀铬窗口打开,但是第一个发送键命令只是对一个窗口执行3次,导致测试失败。
我已经在每个场景之前在一个objectcontainer中注册了我的驱动程序,如下所示:
[Binding]
public class WebDriverSupport
{
private readonly IObjectContainer _objectContainer;
public WebDriverSupport(IObjectContainer objectContainer)
{
_objectContainer = objectContainer;
}
[BeforeScenario]
public void InitializeWebDriver()
{
var driver = GetWebDriverFromAppConfig();
_objectContainer.RegisterInstanceAs<IWebDriver>(driver);
}
然后在我的specflow步骤定义中调用驱动程序:
_driver = (IWebDriver)ScenarioContext.Current.GetBindingInstance(typeof(IWebDriver));
ScenarioContext.Current.Add("Driver", _driver);
然而,这没有任何区别,似乎我的测试试图对一个驱动程序执行所有命令。
有人可以告诉我哪里出错吗?
答案 0 :(得分:1)
您不应该在并行执行上下文中使用ScenarioContext.Current
。如果你通过_objectContainer.RegisterInstanceAs
注入驱动程序,你将通过构造函数注入在你的步骤类的构造函数中接收它,如下所示:
public MyScenarioSteps(IWebDriver driver)
{
_driver = driver;
}
更多信息:
在我看来,这是非常混乱的。
答案 1 :(得分:0)
这可能不是一个答案,但对于评论来说太大了。
如果您只是从当前的场景环境中获取它而不是通过DI机制注入它,为什么使用IObjectContainer
?我会试试这个:
[Binding]
public class WebDriverSupport
{
[BeforeScenario]
public void InitializeWebDriver()
{
var driver = GetWebDriverFromAppConfig();
ScenarioContext.Current.Add("Driver",driver);
}
}
然后在你的步骤中:
_driver = (IWebDriver)ScenarioContext.Current.Get("Driver");
只要GetWebDriverFromAppConfig
返回一个新实例,你就可以了......