specflow selenium webdriver end end example
Przykład od końca do końca korzystania ze Specflow i Selenium Webdriver:
W tym Bezpłatne serie szkoleń Specflow , do Krótkie wprowadzenie do Specflow zostało podane w naszym poprzednim samouczku.
W tym artykule zobaczymy kompleksowy przykład korzystania ze specyfikacji BDD opartych na Specflow, a testy będą wykonywane przez Selenium Webdriver.
Testy mogą być tak proste, jak przetestowanie funkcji logowania w aplikacji. Po prostu opiszemy te testy za pomocą Specflow, a implementacje Step będą używać sterownika i poleceń Selenium oraz NUnit jako struktury asercji.
Będziemy również używać narzędzia Specflow opartego na NUnit (w przeciwieństwie do Specrun, który nie jest open source i wprowadza losowe opóźnienie w wersji bezpłatnej).
Czego się nauczysz:
Samouczek wideo: Specflow i Selenium
Obejrzyj samouczek wideo na temat Specflow i Selenium:
jak zrobić listę w java
Zacznijmy.
Aby rozpocząć, utwórzmy projekt testu jednostkowego w programie Visual Studio i zainstaluj następujące wymagania wstępne:
# 1) Utwórz projekt testu jednostkowego
Zainstaluj pakiet Nuget dla Nunit i Specflow.
Install-Package Specflow.NUnit
# 2) Zainstaluj Webdriver Selenium dla przeglądarki Chrome.
Można to zainstalować również za pomocą konsoli Menedżera pakietów Nuget za pomocą poniższego polecenia.
Install-Package Selenium.WebDriver.ChromeDriver
# 3) Zainstaluj biblioteki Selenium Webdriver i pomocników Selenium Wait, aby dodać oczekiwania ExpectedCondition.
Install-Package Selenium.WebDriver Install-Package DotNetSeleniumExtras.WaitHelpers
# 4) Teraz usuń plik test.cs z projektu, który jest tworzony automatycznie.
Robimy ten krok, aby uniknąć nieporozumień, ponieważ będziemy używać plików funkcji i plików definicji kroków dla Specflow.
# 5) Utwórz foldery dla funkcji i definicji kroków do przechowywania plików implementacji funkcji i definicji kroku.
Nie jest to obowiązkowy krok, ale jest przydatny do organizowania funkcji i implementacji kroków w oddzielnych folderach.
# 6) Na końcu powyższych kroków struktura rozwiązania i plik packages.config powinny wyglądać tak, jak pokazano poniżej.
Implementacja funkcji i kroków
Teraz zacznijmy od pliku funkcji i rzeczywistej implementacji kroku.
O funkcji - Przykładową funkcją będzie testowanie / weryfikacja funkcji wyszukiwania w witrynie YouTube. Będziemy szukać słowa kluczowego i twierdzić, że użytkownik został przekierowany na stronę wyników wyszukiwania.
Dodaj nowy plik funkcji i nadaj mu nazwę YoutubeSearchFeature.feature
Dodaj scenariusz funkcji wyszukiwania i opis funkcji, jak pokazano poniżej:
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
Powyższy scenariusz zakłada, że test:
- Przejdź do witryny YouTube: Będzie to wymagało platformy do automatyzacji sieci, takiej jak Selenium, która będzie wykorzystywać Webdriver do nawigacji na stronie internetowej w przeglądarce.
- Wyszukaj słowo kluczowe: Ten krok będzie obejmował poszukiwanie odpowiednich elementów wejściowych i przycisków, aby odpowiednio wpisać słowo kluczowe i przeprowadzić wyszukiwanie.
- Potwierdź, że wyniki wyszukiwania są wyświetlane, a użytkownik jest na stronie wyników: Ten krok obejmuje twierdzenia dotyczące weryfikacji, czy użytkownik trafił na właściwą stronę.
Teraz zobaczmy implementacje Step w każdym z kroków.
Wcześniej zrozumiemy, w jaki sposób będziemy integrować logikę / kod Selenium z istniejącą definicją Specflow.
Selen lub jakiekolwiek inne narzędzie (lub kody pośredniczące / makiety / sterowniki testów jednostkowych itp.) są zasadniczo pośrednią częścią wykonania kroku, ale kluczową rzeczą do zrozumienia jest sposób integracji obu tych struktur.
Specflow umożliwia użytkownikom pisanie specyfikacji testowych. Nie narzuca narzędzia, którego należy użyć. Dlatego twórca testów może wybrać dowolną liczbę narzędzi testowych, w zależności od rozwiązanego przypadku użycia.
Aby użyć Selenium w tym scenariuszu, potrzebujemy:
- Wystąpienie WebDriver (dla uproszczenia będziemy używać ChromeDriver), które umożliwi użytkownikowi faktycznie nawigację do strony internetowej za pomocą przeglądarki zgodnie z implementacją sterownika.
- Kilka deklaracji WebElement (i można je wykonać tylko jako część implementacji Step), które są wymagane do interakcji z użytkownikiem i przekazywania danych wejściowych oraz wykonywania akcji itp.
- Kilka twierdzeń dotyczących tytułu okna, adresów URL itp., Które można wykonać na instancji sterownika.
Będziemy tworzyć wystąpienie ChromeWebdriver w pliku Step Implementations.
Dlatego utwórzmy plik definicji kroku. Jak widzieliśmy w ostatnim artykule, Specflow zapewnia mechanizm automatycznego generowania definicji Step (które można później dostosować / zmodyfikować w razie potrzeby).
- Przejdź do pliku elementu, kliknij prawym przyciskiem myszy i wybierz „Generuj definicje kroku”.
- Utwórz nowy plik w utworzonym wcześniej folderze StepDefinitions i nadaj mu nazwę YoutubeSearchFeatureSteps.cs
- Upewnij się, że wszystkie kroki scenariusza zostały odpowiednio powiązane z definicjami kroków.
Wskazówka - modyfikowanie definicji kroków generowanych automatycznie:
Teraz, jeśli uważnie obserwujesz, definicja kroku, która została wygenerowana dla naszego kroku wyszukiwania słowa kluczowego, tj. „Wprowadziłem Indie jako słowo kluczowe wyszukiwania” automatycznie wygenerowanego kodu, nie identyfikuje / oddziela słowa kluczowego wyszukiwania, a zatem nie parametryzuje go.
(Given(@&'I have entered India as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword() { ScenarioContext.Current.Pending(); }
Ale nie tego chcemy. Musimy sparametryzować słowo kluczowe wyszukiwania, w przeciwnym razie dla każdego wyszukiwania słowa kluczowego będziemy musieli utworzyć niestandardową definicję kroku.
Zobaczmy więc, jak zmodyfikować tę definicję kroku do bardziej ogólnej, co pozwoli na sparametryzowanie słowa kluczowego wyszukiwania. Można to zrobić za pomocą prostego dopasowania wyrażeń regularnych.
Zapoznaj się z poniższym przykładem kodu. Zastąpiliśmy słowo kluczowe wyszukiwania przez dopasowanie wyrażenia regularnego, tj. „ (. *) To spowoduje, że zastąpi on wartość dowolnego słowa kluczowego, które przekażesz ze Scenariusza i ustawi wartość słowa kluczowego wyszukiwania w parametrze wejściowym o nazwie „searchString” w poniższym przykładowym kodzie.
(Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { ScenarioContext.Current.Pending() }
W ten sposób zachowuje kod modułowy i pozwala uniknąć powtarzania kodu standardowego dla każdej implementacji Step.
Integracja selenu i logika definicji kroku
Zobaczmy teraz rzeczywistą integrację Selenium ze Specflow. Po wygenerowaniu definicji kroków dodamy do nich kod, aby wykonać rzeczywisty scenariusz testowy.
Zobaczmy, gdzie możemy umieścić i zainicjować instancję sterownika Selenium Web, tak aby była dostępna przez cały czas wykonywania Scenariusza. Umieścimy Driver jako prywatne pole wygenerowanej klasy powiązania. Sterownik zostanie zainicjowany jako część klasy Constructor.
W ten sposób sterownik pozostaje zainicjalizowany przez cały czas trwania testu, ponieważ mamy tylko jeden plik Binding dla wszystkich Steps (i jest inicjowany przed rozpoczęciem wykonywania testu).
Pamiętaj również, że będziemy również wdrażać IDisposable interfejs, tak aby usunąć instancję sterownika, po której nie jest już wymagana. Umieszczenie go w metodzie Dispose () zagwarantuje, że po usunięciu Object klasy, instancja sterownika może również zostać usunięta.
Tak wygląda kod do deklaracji i inicjalizacji instancji 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; } } }
W związku z powyższym instancja sterownika może być używana jako część dowolnej implementacji Step, która jest częścią wykonania scenariusza.
Zobaczmy teraz etapową implementację każdego scenariusza.
# 1) Rozmieść kroki:
Given I have navigated to youtube website And I have entered India as search keyword
Oba te kroki obejmują interakcję z instancją sterownika. Pierwszym krokiem jest otwarcie okna przeglądarki i przejście do witryny YouTube
Drugi krok polega na znalezieniu przycisku wprowadzania wyszukiwania i wprowadzeniu słowa kluczowego „Indie”.
Poniżej znajduje się implementacja obu tych kroków:
((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); }
W pierwszym kroku zwróć uwagę na potwierdzenie, że zapewnia, że nawigacja do youtube powiodła się, sprawdzając tytuł okna.
Uwaga: Istnieją różne sposoby umieszczania asercji w różnych elementach sieci Web lub we właściwościach sterownika, ale końcowym celem tego samouczka jest zilustrowanie w najbardziej uproszczony sposób.
W drugim kroku dodaliśmy dynamiczne oczekiwanie za pomocą ExpectedConditions co zapewni, że pole wyszukiwania będzie widoczne, zanim kod spróbuje wprowadzić słowo kluczowe wyszukiwania.
Przechowujemy również searchString w pliku pole prywatne searchKeyword. Dzieje się tak, aby słowo kluczowe searchKeyword mogło być używane również w innych implementacjach Step.
Wskazówka - przekazywanie danych przez kolejne kroki
Przekazywanie / przechowywanie danych w tym podejściu (tj. Za pomocą zmiennych klas) jest jednym ze sposobów udostępniania danych w powiązaniach Step.
Istnieją inne sposoby, aby to zrobić, podobnie jak sam Specflow zapewnia obiekt dynamicznego słownika o nazwie ScenarioContext. Więcej szczegółów na ten temat podamy w kolejnych artykułach.
# 2) Działaj krok
When I press the search button
Spójrzmy teraz na rzeczywistą czynność, czyli kliknięcie przycisku Wyszukaj. Plik implementacji kroku wyszuka przycisk wyszukiwania i kliknij go, aby wykonać krok scenariusza.
Kod tego kroku wygląda tak, jak pokazano poniżej:
(When(@'I press the search button')) public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); }
# 3) Wreszcie krok potwierdzenia:
Then I should navigate to search results page
Na tym etapie właśnie weryfikujemy we właściwościach sterownika, czy adres URL i tytuł strony zawierają słowo kluczowe wyszukiwania, czy nie.
Poniżej przedstawiono kod tego kroku:
(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)); }
Wykonanie
Teraz spróbujmy wykonać Scenariusz i zobaczyć wyniki. Po wykonaniu Scenariusza wszystkie Kroki Scenariusza będą wykonywane Sekwencyjnie. Test będzie polegał na otwarciu przeglądarki, przejściu do witryny internetowej, a następnie wykonaniu jakiejś czynności.
Wynik testu można zobaczyć, klikając przycisk „Wyjście” w podsumowaniu testu, które pokazuje sukces / niepowodzenie każdego pojedynczego kroku.
Porady
Kroki pośrednie zakończone niepowodzeniem
W przypadku Scenariusza, w którym etapy pośrednie zakończyły się niepowodzeniem, należy pamiętać, że w tych scenariuszach Specflow po prostu nie wykona żadnych pozostałych Kroków tego Scenariusza i oznaczy wynik testu jako nieudany.
czego użyć do otwarcia plików jar
Przeprowadzanie testów z adapterem NUnit
W tym przykładzie wykonaliśmy nasze testy przy użyciu programu uruchamiającego testy Specflow.NUnit (który został zainstalowany za pośrednictwem Menedżera pakietów Nuget).
Różni się to na kilka sposobów, jak pokazano poniżej, od biegacza Specrun, którego używaliśmy we wcześniejszym artykule.
- Specflow.NUnit runner jest open source.
- Nie wprowadza żadnych opóźnień w wykonywaniu testów.
Wniosek
W tym artykule widzieliśmy kompletny przykład integracji Selenium z frameworkiem Specflow poprzez prosty scenariusz testowy wyszukiwania wideo w aplikacji YouTube.
Podczas integracji Selenium omówiliśmy również, jak udostępniać dane w różnych powiązaniach za pośrednictwem prywatnych pól klas. Omówiliśmy również przeprowadzenie testu na biegaczu NUnit kontra biegacz Specrun i porównaliśmy oba szczegółowo.
Pliki kodu
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; } } } }
Obejrzyj nasz nadchodzący samouczek, aby dowiedzieć się więcej o powiązaniach współdzielonych i zakresowych, hakach i ponownym użyciu kroków w Specflow!
POPRZEDNIA samouczek | NEXT Tutorial
rekomendowane lektury
- Cucumber Selenium Tutorial: Cucumber Java Selenium Integracja WebDriver
- Wprowadzenie do Selenium WebDriver - samouczek Selenium # 8
- Integracja Jenkins z Selenium WebDriver: samouczek krok po kroku
- Wdrożenie naszego pierwszego skryptu WebDriver - Selenium WebDriver Tutorial # 10
- Jak radzić sobie z alertami / wyskakującymi okienkami w Selenium WebDriver - Samouczek Selenium nr 16
- WebDriver Cała konfiguracja i instalacja z Eclipse - samouczek Selenium # 9
- Sprawdź widoczność elementów sieci za pomocą różnych typów poleceń WebDriver - samouczek Selenium nr 14
- Samouczek GeckoDriver Selenium: Jak używać GeckoDriver w projektach Selenium