Specflow + Selenium как вынести всю конфигурацию в другую фичу.
Всем привет!
Нужна ваша помомшь, буду рад если кто-нибудь сможет поделиться своими мыслями.
Что имеем: Есть несколько 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#, начал писать свою реализацию, но что то она получается страшно громоздкой, да еще и не работает:)
Вопрос: Как вы решаете подобные задачи? какие практики используете?
Часть реализовать удалось, не работало из за невнимательности
Сейчас тест выгладит так:
все что с <> это параметры
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();
}
Прошу прошения, неверно сказал, не хочу указывать это в step definitions файле каждый раз.
Со временем у меня будет скажем сто step definitions файлов, и я не хочу писать это в кажом.
А создать шаг или фичу вызвав которую буду уверен что браузер закроется в конце теста.
Вызывать фичю хочу из Backgraund.
Идея была такая: есть базовый шаг, который вызываю всегда в Background с определенными параметрами, и один из параметров убить браузер в конце теста.
Степы в Background это теже самые степы, что и в Scenario, то есть их можно использовать и в Background и в Scenario.
[BeforeFeature]/[BeforeScenario] и [AfterFeature]/[AfterScenario] пишутся всего 1 раз и действуют на все сценарии в проекте. Ограничить их использование можно с помощью тэгов, если есть такая необходимость.
Параметры в <> обычно указываются, когда у вас Scenario Outline, поэтому в Background лучше помещать параметры в ’ ', " " или просто использовать без кавычек указав при этом в методе что у него есть параметр в этом месте с помощью (.*).
Зачем?-)
Реально, есть же хуки, Before и After Scneario, можно запускать браузер и его убивать в этих хуках.
Если вы хотите указывать браузер, можете вынести его на уровень выше, например в appConfig и создать ноду, типа:
[BeforeScenario]
public void BeforeScenario()
{
string dType = Properties.Settings.Default.DriverType;
string defaultPage = Properties.Settings.Default.DefaultPage;
// и эти значения передаем в инициализацию вашего браузера, ну и адрес дефолт пейджи
}
[AfterScenario]
public void AfterScenario()
{
Browser.WebDriver.Close();
}