为并行执行设置 selenium webdriver
Setting up selenium webdriver for parallel execution
我正在尝试通过 xUnit 控制台运行程序并行执行大量 selenium 测试。
这些已经执行,我看到3 chrome windows打开,但是第一个发送键命令简单地执行了3次到一个window,导致测试失败。
我已经在每个场景之前在对象容器中注册了我的驱动程序,如下所示:
[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);
然而,这没有任何区别,而且我的测试似乎正在尝试对一个驱动程序执行所有命令。
谁能告诉我哪里出错了?
这可能不是答案,但对于评论来说太大了。
如果你只是从当前场景上下文中获取它而不是通过 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
returns一个新实例就可以了...
您不应该在并行执行上下文中使用 ScenarioContext.Current
。如果您通过 _objectContainer.RegisterInstanceAs
注入驱动程序,您将在步骤 class' 构造函数中通过构造函数注入接收它,如下所示:
public MyScenarioSteps(IWebDriver driver)
{
_driver = driver;
}
更多信息:
- https://github.com/techtalk/SpecFlow/wiki/Parallel-Execution#thread-safe-scenariocontext-featurecontext-and-scenariostepcontext
- https://github.com/techtalk/SpecFlow/wiki/Context-Injection
在我看来,这太乱了。
我正在尝试通过 xUnit 控制台运行程序并行执行大量 selenium 测试。
这些已经执行,我看到3 chrome windows打开,但是第一个发送键命令简单地执行了3次到一个window,导致测试失败。
我已经在每个场景之前在对象容器中注册了我的驱动程序,如下所示:
[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);
然而,这没有任何区别,而且我的测试似乎正在尝试对一个驱动程序执行所有命令。
谁能告诉我哪里出错了?
这可能不是答案,但对于评论来说太大了。
如果你只是从当前场景上下文中获取它而不是通过 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
returns一个新实例就可以了...
您不应该在并行执行上下文中使用 ScenarioContext.Current
。如果您通过 _objectContainer.RegisterInstanceAs
注入驱动程序,您将在步骤 class' 构造函数中通过构造函数注入接收它,如下所示:
public MyScenarioSteps(IWebDriver driver)
{
_driver = driver;
}
更多信息:
- https://github.com/techtalk/SpecFlow/wiki/Parallel-Execution#thread-safe-scenariocontext-featurecontext-and-scenariostepcontext
- https://github.com/techtalk/SpecFlow/wiki/Context-Injection
在我看来,这太乱了。