设置selenium webdriver以进行并行执行

时间:2015-11-25 12:53:47

标签: selenium testing specflow xunit

我正在尝试通过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);

然而,这没有任何区别,似乎我的测试试图对一个驱动程序执行所有命令。

有人可以告诉我哪里出错吗?

2 个答案:

答案 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返回一个新实例,你就可以了......