Specflow + Selenium как вынести всю конфигурацию в другую фичу.

Specflow + Selenium как вынести всю конфигурацию в другую фичу.

Всем привет!:slight_smile:
Нужна ваша помомшь, буду рад если кто-нибудь сможет поделиться своими мыслями.

Что имеем: Есть несколько Specflow тестов написанных на C# с помощью Selenium.

Пример:

        Given Start the browser with Google page
	When type <textToFind> search field
	And I press search
	Then the first line in search results should contain text <seacrhResultValue>

Шаг “Given Start the browser with Google page” выглядит так:

[Given(@"Start the browser with Google page")]
        public void GivenStartTheBrowserWithGooglePage()
        {
            driver = new FirefoxDriver();
            baseURL = "https://www.google.co.nz/";
            driver.Navigate().GoToUrl(baseURL);
            driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
        }

Плюс в этом тесте есть

[AfterScenario]
        public void AfterScenario()
        {
            //Убивает браузер вконце
            driver.Quit(); 
        }

Задача: Вынести всю инициализацию IWebDriver и [AfterScenario] блок в отдельную фичу что бы не писать ее каждый раз для нового feture файла, и вызвать ее с разными параметрами.
Как вижу это я:

Background: 
     Given Start the <browser> with <Google> page whit specific <parameters>
	
@mytag
Scenario Outline: Test Google
	Given type <textToFind> search field
	When I press search
	Then the first line in search results should contain text <seacrhResultValue>

Не большой специалист по C#, начал писать свою реализацию, но что то она получается страшно громоздкой, да еще и не работает:)

Вопрос: Как вы решаете подобные задачи? какие практики используете?

Спасибо,
Илья.

Часть реализовать удалось, не работало из за невнимательности :frowning:
Сейчас тест выгладит так:
все что с <> это параметры

Feature: SpecFlowFeature1
Background: 
	Given start <FireFox> with <www.google.co.nz>
	
@mytag
Scenario Outline: Test Google
	And type <textToFind> search field
	When I press search
	Then the first line in search results should contain text <seacrhResultValue>

	Examples: 

	| textToFind | seacrhResultValue                                             |
	| test       | Test Server: Tanki Online                                     | 

Но не знаю куда запихнуть

[AfterScenario]
        public void AfterScenario()
        {
            //Убивает браузер вконце
            driver.Quit();
        }

Не хочется писать его в каждом feture файле

Используйте [BeforeFeature]/[BeforeScenario] и [AfterFeature]/[AfterScenario] создания и убийства драйвера, не нужно эти шаги явно указывать в фича-файлах

Прошу прошения, неверно сказал, не хочу указывать это в step definitions файле каждый раз.
Со временем у меня будет скажем сто step definitions файлов, и я не хочу писать это в кажом.
А создать шаг или фичу вызвав которую буду уверен что браузер закроется в конце теста.
Вызывать фичю хочу из Backgraund.

Идея была такая: есть базовый шаг, который вызываю всегда в Background с определенными параметрами, и один из параметров убить браузер в конце теста.

Степы в Background это теже самые степы, что и в Scenario, то есть их можно использовать и в Background и в Scenario.
[BeforeFeature]/[BeforeScenario] и [AfterFeature]/[AfterScenario] пишутся всего 1 раз и действуют на все сценарии в проекте. Ограничить их использование можно с помощью тэгов, если есть такая необходимость.
Параметры в <> обычно указываются, когда у вас Scenario Outline, поэтому в Background лучше помещать параметры в ’ ', " " или просто использовать без кавычек указав при этом в методе что у него есть параметр в этом месте с помощью (.*).

Зачем?-)
Реально, есть же хуки, Before и After Scneario, можно запускать браузер и его убивать в этих хуках.
Если вы хотите указывать браузер, можете вынести его на уровень выше, например в appConfig и создать ноду, типа:

<setting name="DriverType" serializeAs="String">
        <value>FireFox</value>
</setting>

<setting name="DefaultPage" serializeAs="String">
        <value>www.google.co.nz</value>
</setting>

и потом получаем эти стринги и пихаем в хуки:

[BeforeScenario]
        public void BeforeScenario()
        {
            string dType = Properties.Settings.Default.DriverType;
            string defaultPage = Properties.Settings.Default.DefaultPage;
           // и эти значения передаем в инициализацию вашего браузера, ну и адрес дефолт пейджи
        }

[AfterScenario]
            public void AfterScenario()
            {
                Browser.WebDriver.Close();
            }
1 лайк

В принципе коллеги все правильно сказали - использовать [BeforeFeature]/[BeforeScenario] - поделюсь лишь ссылкой Slenium Webdriver + Specflow