specflow selenium webdriver end end example
Пример за използване на Specflow & Selenium Webdriver:
В това Безплатна серия Specflow Training , да се Кратко въведение за Specflow беше даден в предишния ни урок.
В тази статия ще видим пример от край до край за използване на спецификации BDD, базирани на Specflow и тестовете ще се изпълняват чрез Selenium Webdriver.
Тестовете могат да бъдат толкова прости, колкото тестването на функционалността за вход на приложение. Просто ще опишем тези тестове, използвайки Specflow, а реализациите на Step ще използват драйвер и команди Selenium и NUnit като рамка за твърдение.
Също така ще използваме базиран на NUnit Specflow runner (за разлика от Specrun, който не е с отворен код и въвежда произволно забавяне в безплатната версия).
Какво ще научите:
Видео урок: Specflow и селен
Вижте видео урока за Specflow и Selenium:
кой е най-добрият блокиращ прозорец за хром
Да започваме.
За да започнем, нека създадем проект за единичен тест в Visual Studio и да инсталираме следните предпоставки:
# 1) Създайте проект за единичен тест
Инсталирайте пакета Nuget за Nunit и Specflow.
Install-Package Specflow.NUnit
# 2) Инсталирайте Webdriver на Selenium за браузър chrome.
Това може да се инсталира и чрез конзолата Nuget Package Manager чрез командата по-долу.
Install-Package Selenium.WebDriver.ChromeDriver
# 3) Инсталирайте библиотеки на Selenium Webdriver и помощници за изчакване на Selenium за добавяне на очаквания ExpectedCondition.
Install-Package Selenium.WebDriver Install-Package DotNetSeleniumExtras.WaitHelpers
# 4) Сега премахнете файла test.cs от проекта, който се създава автоматично.
Правим тази стъпка, за да избегнем объркване, тъй като ще използваме файлове с функции и файлове за дефиниция на стъпки за Specflow.
# 5) Създайте папки за функции и дефиниции на стъпки, за да съхранявате файлове за изпълнение на дефиниция на функции и стъпки.
Това не е задължителна стъпка, но е полезно за организиране на функциите и изпълнението на стъпки в отделни папки.
# 6) В края на горните стъпки структурата на решението и пакетите.config трябва да изглеждат, както е показано по-долу.
Внедряване на функции и стъпки
Сега нека да започнем с файла на характеристиките и действителната реализация на стъпката.
Относно характеристиката - Примерната функция ще бъде за тестване / валидиране на функционалността за търсене на уебсайта на Youtube. Ще търсим ключова дума и ще твърдим, че потребителят е бил пренасочен към страницата с резултати от търсенето.
Добавете нов файл с функции и го кръстете като YoutubeSearchFeature.feature
Добавете сценарий за функционалност на търсене и описание на функцията, както е показано по-долу:
Feature: YoutubeSearchFeature In order to test search functionality on youtube As a developer I want to ensure functionality is working end to end @mytag Scenario: Youtube should search for the given keyword and should navigate to search results page Given I have navigated to youtube website And I have entered India as search keyword When I press the search button Then I should be navigate to search results page
Горният сценарий очаква тестът да:
- Отидете до уебсайта на Youtube: Това ще изисква рамка за автоматизация на уеб като Selenium, която ще използва Webdriver за навигация до уеб страница в браузър.
- Потърсете ключова дума: Тази стъпка ще включва търсене на подходящи елементи за въвеждане и бутони, за да се въведе ключовата дума и съответно да се извърши търсенето.
- Потвърдете, че резултатите от търсенето се показват и потребителят е на страницата с резултати: Тази стъпка ще включва твърдения за проверка дали потребителят е попаднал на правилната страница.
Сега нека видим реализациите на стъпката всяка от стъпките.
Преди това нека да разберем как ще интегрираме логиката / кода на Selenium в съществуващата дефиниция на Specflow.
Селен или който и да е друг инструмент (или модули за тестване на модули / макети / драйвери и т.н.) са по същество междинна част от изпълнението на стъпката, но ключовото нещо, което трябва да се разбере, е начинът за интегриране на двете тези рамки.
Specflow позволява на потребителите да пишат спецификации за тестове. Той не диктува инструмента, който трябва да се използва. Следователно разработчикът на тестове е свободен да избере толкова инструменти за тестване, колкото иска, да зависи от случая на употреба, който се решава.
За да използваме селен в този сценарий, ни е необходимо следното:
- Екземпляр на WebDriver (ние ще използваме ChromeDriver за простота), който ще позволи на потребителя действително да навигира до уеб страницата, използвайки браузър според изпълнението на драйвера.
- Малко декларации на WebElement (и могат да бъдат направени само като част от реализациите на Step), които са необходими за взаимодействие с потребителя и предаване на входове и извършване на действия и т.н.
- Няколко твърдения за заглавие на прозорец, URL адреси и т.н., които могат да бъдат изпълнени на потребителски модел.
Ще създадем екземпляр на ChromeWebdriver във файла за изпълнение на стъпки.
Следователно, нека създадем файла с дефиниция на стъпка. Както видяхме в последната статия, Specflow предоставя механизъм за автоматично генериране на дефинициите на стъпка (които по-късно могат да бъдат персонализирани / модифицирани според изискванията).
- Придвижете се до файла с функции, щракнете с десния бутон и изберете „Генериране на дефиниции на стъпки“.
- Създайте нов файл в папката StepDefinitions, както създадохме по-рано, и наречете файла като YoutubeSearchFeatureSteps.cs
- Уверете се, че всички стъпки на сценария са били обвързани с дефинициите на стъпката по подходящ начин.
Съвет - Модифициране на автоматично генерирани дефиниции на стъпки:
Сега, ако внимателно наблюдавате, дефиницията на стъпка, която е генерирана за нашата стъпка на ключовата дума за търсене, т.е. „Въведох Индия като ключова дума за търсене“, автоматично генерираният код не идентифицира / отделя ключовата дума за търсене и следователно не я параметризира.
(Given(@&'I have entered India as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword() { ScenarioContext.Current.Pending(); }
Но това не е това, което искаме. Необходимо е ключовата дума за търсене да бъде параметризирана, в противен случай за всяко търсене на ключови думи ще трябва да създадем персонализирана дефиниция на стъпка.
Така че, нека видим, как да модифицираме тази дефиниция на стъпка към по-обща, която ще позволи да параметризира ключовата дума за търсене. Това може да стане чрез просто съвпадение на регулярни изрази.
Обърнете се към примера по-долу за код. Заменихме ключовата дума за търсене чрез съвпадение на регулярни изрази, т.е. „ (. *) Това, което ще направите, е, че ще замени стойността на която и да е ключова дума, която ще предадете от Сценария, и ще зададе стойността на ключовата дума за търсене във входния параметър с име „searchString“ в примера по-долу на кода.
(Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { ScenarioContext.Current.Pending() }
По този начин той запазва модула на кода и избягва повтарящия се шаблон за всяка стъпка.
Интеграция на селен и логика за определяне на стъпки
Сега нека видим действителната интеграция на Selenium със Specflow. След като дефинициите на стъпките бъдат генерирани, сега ще добавим код към тях, за да изпълним действителния тестов сценарий.
Нека видим къде можем да поставим и инициализираме екземпляра на драйвера на Selenium Web, така че да е достъпен през цялото изпълнение на сценария. Ще поставим драйвера като частно поле на генерирания клас на обвързване. Драйверът ще бъде инициализиран като част от конструктора на класа.
По този начин драйверът остава инициализиран през целия ход на продължителността на теста, тъй като разполагаме само с един свързващ файл за всички стъпки (и той се инициализира преди началото на теста).
Също така имайте предвид, че ние също ще прилагаме Идентифицира се интерфейс, така че да се разпорежда с екземпляра на драйвера, след който вече не се изисква. Поставянето му в метода Dispose () ще гарантира, че след като обектът на класа се изхвърли, екземплярът на драйвера също може да бъде изхвърлен.
Ето как изглежда кодът за деклариране и инициализиране на екземпляр на WebDriver:
(Binding) public class YoutubeSearchFeatureSteps : IDisposable { private String searchKeyword; private ChromeDriver chromeDriver; public YoutubeSearchFeatureSteps() => chromeDriver = new ChromeDriver(); //... other Step defintion implementations public void Dispose() { if(chromeDriver != null) { chromeDriver.Dispose(); chromeDriver = null; } } }
С горното, екземплярът на драйвера може да се използва като част от всяко изпълнение на стъпка, което е част от изпълнението на сценария.
Нека сега видим стъпката за изпълнение на всеки отделен сценарий.
# 1) Подредете стъпки:
Given I have navigated to youtube website And I have entered India as search keyword
И двете стъпки включват взаимодействие с екземпляра на драйвера. Първата стъпка се отваря в прозореца на браузъра и се придвижва до уебсайта на YouTube
Втората стъпка търси бутона за въвеждане на търсене и въвежда „Индия“ като ключова дума за търсене.
По-долу е представено изпълнението на двете стъпки:
((Given(@'I have navigated to youtube website')) public void GivenIHaveNavigatedToYoutubeWebsite() { chromeDriver.Navigate().GoToUrl('https://www.youtube.com'); Assert.IsTrue(chromeDriver.Title.ToLower().Contains('youtube')); } 7. (Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { this.searchKeyword = searchString.ToLower(); var searchInputBox = chromeDriver.FindElementById('search'); var wait = new WebDriverWait(chromeDriver, TimeSpan.FromSeconds(2)); wait.Until(ExpectedConditions.ElementIsVisible(By.Id('search'))); searchInputBox.SendKeys(searchKeyword); }
За първата стъпка забележете твърдението, че то гарантира, че навигацията до youtube е била успешна, като проверите заглавието на прозореца.
Забележка: Може да има различни начини за поставяне на твърдения върху различни уеб елементи или свойства на драйвера, но крайната цел на този урок е само да илюстрира с най-опростения начин.
Във втората стъпка добавихме динамично изчакване, използвайки Очаквани условия което ще гарантира, че полето за търсене е видимо, преди кодът да се опита да въведе ключовата дума за търсене.
Също така съхраняваме searchString в търсене в частно поле Ключова дума. Това се прави, за да може searchKeyword да се използва и в други реализации на стъпка.
Съвет - Предаване на данни през стъпките
Предаването / съхраняването на данни по този подход (т.е. чрез променливи на класа) е едно от средствата, чрез които данните могат да се споделят в обвързването на стъпка.
Има и други начини да направите това, тъй като самият Specflow предоставя динамичен обект на речника, наречен ScenarioContext. Повече подробности за това ще видим в предстоящите статии.
# 2) Действайте стъпка
When I press the search button
Сега нека разгледаме действителното действие, което е щракване върху бутона Търсене. Файлът за внедряване на стъпката ще търси бутона за търсене и щракне върху него, за да изпълни стъпката на сценария.
Кодът за тази стъпка изглежда както е показано по-долу:
(When(@'I press the search button')) public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); }
# 3) Накрая стъпката за потвърждаване:
Then I should navigate to search results page
В тази стъпка ние просто проверяваме от свойствата на драйвера дали URL адресът и заглавието на страницата съдържа ключовата дума за търсене или не.
Кодът за тази стъпка е показан по-долу:
(Then(@'I should be navigate to search results page')) public void ThenIShouldBeNavigateToSearchResultsPage() { // After search is complete the keyword should be present in url as well as page title` Assert.IsTrue(chromeDriver.Url.ToLower().Contains(searchKeyword)); Assert.IsTrue(chromeDriver.Title.ToLower().Contains(searchKeyword)); }
Екзекуция
Сега, нека се опитаме да изпълним сценария и да видим резултатите. След като сценарият бъде изпълнен, всички стъпки на сценария ще бъдат изпълнени последователно. Тестът ще бъде отваряне на браузър, навигация до уебсайт и след това извършване на някакво действие.
Резултатът от теста може да се види, като щракнете върху бутона „Изход“ от резюмето на теста, който показва успеха / неуспеха на всяка отделна стъпка.
Съвети
Междинни неуспешни стъпки
В случай, че сценарий има междинни стъпки, които се провалят, моля, имайте предвид, че в тези сценарии Specflow просто няма да изпълни останалите стъпки от този сценарий и ще отбележи резултата от теста като неуспешен.
въпроси за интервю и отговори за бизнес анализатор
Извършване на тестове с адаптер NUnit
За този пример ние изпълнихме нашите тестове, като използвахме тестовата програма Specflow.NUnit (която бяхме инсталирали чрез Nuget Package Manager).
Това е различно по няколко начина, както е показано по-долу от бегача Specrun, който бяхме използвали в по-ранната статия.
- Specflow.NUnit runner е с отворен код.
- Той не въвежда никакво забавяне при изпълнение на тестовете.
Заключение
В тази статия видяхме пример за интегриране на селен с рамка Specflow чрез прост тестов сценарий за търсене на видео в приложението Youtube.
Докато интегрирахме Selenium, ние също преминахме през това как да споделяме данни в различни обвързвания чрез полета на частния клас. Също така разгледахме провеждането на теста на NUnit runner срещу Specrun runner и сравнихме и двете подробно.
Кодови файлове
YoutubeSearchFeature.feature
Feature: YoutubeSearchFeature In order to test search functionality on youtube As a developer I want to ensure functionality is working end to end @mytag Scenario: Youtube should search for the given keyword and should navigate to search results page Given I have navigated to youtube website And I have entered India as search keyword When I press the search button Then I should be navigate to search results page
YoutubeSearchFeatureSteps.cs
using NUnit.Framework; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Support.UI; using SeleniumExtras.WaitHelpers; using System; using System.Collections.Generic; using System.Linq; using TechTalk.SpecFlow; namespace SepcflowSelenium.StepDefinitions { (Binding) public class YoutubeSearchFeatureSteps : IDisposable { private String searchKeyword; private ChromeDriver chromeDriver; public YoutubeSearchFeatureSteps() => chromeDriver = new ChromeDriver(); (Given(@'I have navigated to youtube website')) public void GivenIHaveNavigatedToYoutubeWebsite() { chromeDriver.Navigate().GoToUrl('https://www.youtube.com'); Assert.IsTrue(chromeDriver.Title.ToLower().Contains('youtube')); } (Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { this.searchKeyword = searchString.ToLower(); var searchInputBox = chromeDriver.FindElementById('search'); var wait = new WebDriverWait(chromeDriver, TimeSpan.FromSeconds(2)); wait.Until(ExpectedConditions.ElementIsVisible(By.Id('search'))); searchInputBox.SendKeys(searchKeyword); } (When(@'I press the search button')) public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); } (Then(@'I should be navigate to search results page')) public void ThenIShouldBeNavigateToSearchResultsPage() { System.Threading.Thread.Sleep(2000); // After search is complete the keyword should be present in url as well as page title` Assert.IsTrue(chromeDriver.Url.ToLower().Contains(searchKeyword)); Assert.IsTrue(chromeDriver.Title.ToLower().Contains(searchKeyword)); } public void Dispose() { if(chromeDriver != null) { chromeDriver.Dispose(); chromeDriver = null; } } } }
Внимавайте за нашия предстоящ урок, за да научите повече за споделени и обхванати обвързвания, куки и повторно използване на стъпки в Specflow!
PREV Урок | СЛЕДВАЩ урок
Препоръчително четене
- Урок за краставици селен: Интеграция на краставица Java Selenium WebDriver
- Въведение в Selenium WebDriver - Урок № 8 за селен
- Интеграция на Jenkins с Selenium WebDriver: Урок стъпка по стъпка
- Внедряване на нашия първи скрипт за WebDriver - Урок № 10 за Selenium WebDriver
- Как да боравим със сигнали / изскачащи прозорци в Selenium WebDriver - Урок за селен # 16
- Цялата настройка и инсталиране на WebDriver с Eclipse - Урок № 9 за селен
- Проверете видимостта на уеб елементите, като използвате различни типове команди WebDriver - Урок № 14 за селен
- Урок за GeckoDriver селен: Как да използвам GeckoDriver в проекти за селен