specflow selenium webdriver end end example
Приклад використання кінця в кінець Specflow & Selenium Webdriver:
У цьому Безкоштовна навчальна серія Specflow , до Короткий вступ до Specflow було подано в нашому попередньому уроці.
У цій статті ми побачимо наскрізний приклад використання специфікацій BDD на основі Specflow, і тести будуть виконуватися через Selenium Webdriver.
Тести можуть бути такими простими, як перевірка функціональності входу програми. Це просто те, що ми опишемо ці тести за допомогою Specflow, а реалізації Step використовуватимуть драйвер і команди Selenium та NUnit як основу твердження.
Ми також будемо використовувати NUnit на основі Specflow runner (на відміну від Specrun, який не є відкритим кодом і вводить випадкову затримку у безкоштовній версії).
Що ви дізнаєтесь:
Відео-посібник: Спекфлоу та селен
Перегляньте відеоурок про Specflow та Селен:
де знаходиться ключ безпеки мережі, розташований на моєму маршрутизаторі
Давайте розпочнемо.
Для початку давайте створимо проект модульного тестування у Visual Studio та встановимо такі передумови:
# 1) Створіть проект модульного тесту
Встановіть пакет Nuget для Nunit та Specflow.
Install-Package Specflow.NUnit
# 2) Встановіть веб-драйвер Selenium для браузера Chrome.
Це можна встановити через консоль Nuget Package Manager також за допомогою наведеної нижче команди.
Install-Package Selenium.WebDriver.ChromeDriver
# 3) Встановіть бібліотеки Selenium Webdriver та помічники очікування Selenium для додавання очікуваних очікуваних умов.
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 у файлі Step Implementations.
Отже, давайте створимо файл визначення кроку. Як ми бачили в минулій статті, 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() }
Таким чином, він зберігає модульний код і дозволяє уникнути повторного типового коду для кожного етапу реалізації.
Інтеграція селену та логіка визначення кроків
Тепер давайте подивимось на фактичну інтеграцію селену з 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 можна було використовувати і в інших реалізаціях Step.
Порада. Передача даних через кроки
Передача / зберігання даних за цим підходом (тобто через змінні класу) є одним із засобів, за допомогою яких дані можуть обмінюватися між прив’язками Step.
Є й інші способи зробити це, як сам 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 просто не виконає жодних інших кроків цього сценарію і позначить результат тесту як невдалий.
запитання та відповіді на кодування інтерв’ю у Java
Запуск тестів з адаптером NUnit
Для цього прикладу ми виконали наші тести за допомогою запуску тесту Specflow.NUnit (який ми встановили через Nuget Package Manager).
Це відрізняється кількома способами, як показано нижче від бігуна Specrun, який ми використовували в попередній статті.
- Бігун Specflow.NUnit є відкритим.
- Це не призводить до затримок під час виконання тестів.
Висновок
У цій статті ми побачили наскрізний приклад інтеграції селену з фреймворком Specflow за допомогою простого тестового сценарію пошуку відео в додатку Youtube.
Інтегруючи Selenium, ми також пройшли шлях до обміну даними між різними прив’язками через поля приватного класу. Ми також розглянули запуск тесту на бігуні NUnit проти бігуна Specrun та детально порівняли обидва.
Файли коду
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!
НАЗАД Підручник | НАСТУПНИЙ підручник
Рекомендована література
- Підручник з огірка селену: інтеграція огірка Java Selenium WebDriver
- Вступ до Selenium WebDriver - Підручник з селену №8
- Інтеграція Дженкінса з Selenium WebDriver: покроковий посібник
- Впровадження нашого першого сценарію WebDriver - Підручник № 10 для Selenium WebDriver
- Як обробляти сповіщення / спливаючі вікна в Selenium WebDriver - Підручник з селену No16
- Повне налаштування та встановлення WebDriver за допомогою Eclipse - Підручник селену № 9
- Перевірте видимість веб-елементів, використовуючи різні типи команд WebDriver - Підручник з селену №14
- Підручник з селену GeckoDriver: Як використовувати GeckoDriver у проектах селену