2015-11-25 2 views
0

Я пытаюсь выполнить большой набор тестов selenium через консольный консоль xUnit параллельно.Настройка selenium webdriver для параллельного выполнения

Они выполнены, и я вижу, что открываются 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

Возможно, просмотр содержимого 'GetWebDriverFromAppConfig();' был бы полезным, поскольку именно здесь вы фактически создаете экземпляр веб-драйвера, предположительно –

+0

Привет, это просто метод, который возвращает драйвер на основе записи в приложении. конфигурации. В этом случае это хром-драйвер. – user3451887

ответ

1

Вы не должны использовать ScenarioContext.Current в контексте параллельного выполнения. Если вы инъекционные драйвер через _objectContainer.RegisterInstanceAs вы получите его через инъекции конструктора в вашем шаги класса конструктор, например, так:

public MyScenarioSteps(IWebDriver driver) 
{ 
    _driver = driver; 
} 

Подробнее:

По-моему, это ужасно грязно.

0

Это может быть не ответ, но слишком большой для комментария.

Почему вы используете IObjectContainer, если вы просто получаете его из контекста текущего сценария и не вводите его через механизм DI? Я хотел бы попробовать это:

[Binding] 
public class WebDriverSupport 
{ 
    [BeforeScenario] 
    public void InitializeWebDriver() 
    { 
     var driver = GetWebDriverFromAppConfig();      
     ScenarioContext.Current.Add("Driver",driver); 
    } 
} 

то в ваших шагов:

_driver = (IWebDriver)ScenarioContext.Current.Get("Driver"); 

Пока GetWebDriverFromAppConfig возвращает новый экземпляр вы должны быть в порядке ...

Смежные вопросы