为并行执行设置 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;
}

更多信息:

在我看来,这太乱了。