t.me/atinfo_chat Telegram группа по автоматизации тестирования

Specflow+ selenium открывается второй экземпляр браузера

csharp
specflow
nunit
webdriver
Теги: #<Tag:0x00007f9c50c283e8> #<Tag:0x00007f9c50c28208> #<Tag:0x00007f9c50c280a0> #<Tag:0x00007f9c50c2fee0>

(Максим Лаптев) #1

Здравствуйте, по какой-то причине открывается второй экземпляр браузера
Берем один и тот же тест, переработанный для Nunit и Specflow(+Nunit)

Nunit тест инициализаируется в начале и отрабатывает ок, бразуер открывается 1

[OneTimeSetUp]
        public void Init()
        {
            driver = new WebDriver().Driver;

        }

Specflow тест запускается посредством Nunit и отрабатывает тоже ок, но за одним исключением
Инициализация драйвера

	[BeforeScenario]
        public void Init()
        {
            driver = new WebDriver().Driver;

        }

Но в текущем случае, запускается сперва 1 экземпляр браузера, а затем второй, в котором тест отрабатывает
Собственно, как я понял дело в аннотациях перед тестом [BeforeScenario],[Before] всяко пробовал, но почему то результат один


(Valentin G ) #2

Думаю, если вы уберете аннотацию [OneTimeSetup] то два броузера не будут запускаться. Это чисто NUnit’ овская вещь. Для SpecFlow лучше перед сценарием запускать броузер и закрывать его после сценария. Для NUnit тоже, есть аннотации [SetUp] , [TearDown].


(Максим Лаптев) #3

убирал, оставлял только [BeforeScenario] или [Before]


(Максим Лаптев) #4

прикольно, нашел зависимость, у меня 2 файла feature и 2 класса с нимим связанных
в обоих классах стоит [Binding], собственно запускаю 1 тест, но он видимо для всех указанных [Binding] запускает браузер.
Добавил 3й класс, запустились 3 браузера.

Тогда другой вопрос, как при запуске 1 теста запускать 1 браузер с учетом выявленной проблемы? конкретно в каждом классе отдельно инициализировать и закрывать драйвер?
При использовании общего класса инициализации и закрытия драйвера получается проблема.


(Valentin G ) #5

Я бы сделал отдельный Hooks.cs для Scenario from Features, а классические NUnit тесты пускай наследуются как обычно. Тогда для классических тестов и для сценариев будет своя система запуска. Вообще, если видеть проект, его структуру текущую, то легче сказать.


(Максим Лаптев) #6

Всю структуру сложно скинуть, могу только чуть описать
Есть 1 файл feature там 2 сценария Given, When, Then

Каждый класс по сценарию начинается с

 [Binding]
    public class Test : BaseTest
    {	
	Given
	When
	Then}

В самом BaseTest инициализация

        public void Init()
        {
            driver = new WebDriver().Driver;

        }

Из за того, что в начале каждого класса у меня [Binding] он для каждого теста инициализирует браузер.
Получается запускаем пачку из 2х тестов,
прогон теста 1 - запуск 2х браузеров
прогоне теста 2 - запуск 2х браузеров

Может я чего неверно делаю, не знаю
Nunit тесты вообще не трогаю.
Еще момент, как я понимаю SpecFlow ищет все аннотации [Binding] в классах проекта и для каждого из них срабатывает аннотация [BeforeScenario] или что то путаю?


(Valentin G ) #7
  1. Сделай класс Hooks который будет наследовать от BaseTest.
  2. Добавь ему аннотацию `[Binding].
  3. Добавь property - private readonly IObjectContainer _objectContainer;
  4. Добавь два метода -
[BeforeScenario]
public void Init()
{
  driver = new WebDriver().Driver;
  _objectContainer.RegisterInstanceAs(_driver);
}
[AfterScenario]
public void Init()
{
  driver.close()// закрытие броузера
}

  1. Steps классы не должны наследовать от BaseTest класса.
  2. Верхушка степ класса должна быть похожей на это:
[Binding]
    public class CommonSteps
    {
       private readonly Driver _driver;
       public CommonSteps(Driver driver)
        {
            commonWebElementsPageObject = new CommonWebElementsPageObject(driver);
            _driver = driver;
        }

В этом случае у тебя будет организована Dependency Injection, а броузер будет открываться один раз.


(Максим Лаптев) #8

Сработало, благодарю