specflow selenium webdriver end end example
Příklad použití technologie Specflow a selenového webdriveru:
V tomhle Bezplatná řada Specflow Training , do Krátký úvod do Specflow byl uveden v našem předchozím tutoriálu.
V tomto článku uvidíme úplný příklad použití specifikací BDD založených na Specflow a testy budou provedeny prostřednictvím selenového webového ovladače.
Testy mohou být stejně jednoduché jako testování přihlašovací funkce aplikace. Je to jen to, že tyto testy popíšeme pomocí Specflow a implementace Step budou používat selenový ovladač a příkazy a NUnit jako kontrolní rámec.
Použijeme také běžec Specflow založený na NUnit (na rozdíl od Specrun, který není otevřeným zdrojem a zavádí náhodné zpoždění ve volné verzi).
Co se naučíte:
Výukový program pro video: Specflow a selen
Podívejte se na video tutoriál Specflow a Selenium:
otázky ohledně rozhovoru pro unix pro vývojáře v jazyce Java
Začněme.
Začněme vytvořením projektu testování jednotek v sadě Visual Studio a instalací následujících předpokladů:
# 1) Vytvořte projekt testování jednotky
Nainstalujte balíček Nuget pro Nunit a Specflow.
Install-Package Specflow.NUnit
# 2) Nainstalujte si webový ovladač Selenium pro prohlížeč Chrome.
To lze nainstalovat prostřednictvím konzoly Nuget Package Manager také pomocí níže uvedeného příkazu.
Install-Package Selenium.WebDriver.ChromeDriver
# 3) Nainstalujte si knihovny Selenium Webdriver a Selenium Wait Helpers pro přidání čekání ExpectedCondition.
Install-Package Selenium.WebDriver Install-Package DotNetSeleniumExtras.WaitHelpers
# 4) Nyní odeberte soubor test.cs z projektu, který je vytvořen automaticky.
Děláme tento krok, abychom se vyhnuli nejasnostem, protože pro Specflow budeme používat soubory funkcí a soubory definic kroků.
# 5) Vytvořte složky pro funkce a definice kroku pro uložení souborů implementace funkcí a definice kroku.
Toto není povinný krok, ale je užitečné uspořádat funkce a implementace kroků do samostatných složek.
# 6) Na konci výše uvedených kroků by struktura řešení a packages.config měly vypadat, jak je znázorněno níže.
Implementace funkcí a kroků
Nyní pojďme začít se souborem funkcí a skutečnou implementací kroků.
O funkci - Ukázkovou funkcí bude testování / ověřování funkčnosti vyhledávání na webových stránkách Youtube. Budeme hledat klíčové slovo a tvrdíme, že byl uživatel přesměrován na stránku s výsledky vyhledávání.
Přidejte nový soubor funkcí a pojmenujte jej jako YoutubeSearchFeature.feature
Přidejte scénář a popis funkce vyhledávání, jak je uvedeno níže:
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
Výše uvedený scénář očekává, že test:
- Přejít na web Youtube: To bude vyžadovat rámec pro automatizaci webu, jako je Selenium, který bude k procházení na webovou stránku v prohlížeči používat Webdriver.
- Hledat klíčové slovo: Tento krok bude zahrnovat hledání vhodných vstupních prvků a tlačítek, aby bylo možné klíčové slovo zadat a spustit vyhledávání.
- Potvrďte, že se zobrazí výsledky hledání a uživatel je na stránce s výsledky: Tento krok bude zahrnovat tvrzení týkající se ověření, zda uživatel přistál na správné stránce.
Nyní se podívejme na implementace jednotlivých kroků.
Předtím pochopme, jak budeme integrovat selenovou logiku / kód do stávající definice Specflow.
Selen nebo jakýkoli jiný nástroj (nebo testovací jednotky / falešné ovladače / ovladače atd.) jsou v podstatě mezilehlou součástí provedení kroku, ale klíčovou věcí, které je třeba porozumět, je způsob integrace obou těchto rámců.
Specflow umožňuje uživatelům psát specifikace testů. Nediktuje nástroj, který by měl být použit. Vývojář testů si tedy může zvolit tolik testovacích nástrojů, kolik chce, aby závisel na případu použití, který se právě řeší.
Aby bylo možné v tomto scénáři použít selen, potřebujeme následující:
- Instance WebDriver (pro zjednodušení budeme používat ChromeDriver), která uživateli umožní skutečnou navigaci na webovou stránku pomocí prohlížeče podle implementace ovladače.
- Několik prohlášení WebElement (a lze je provést pouze jako součást implementací Step), která jsou nutná pro interakci s uživatelem a předávání vstupů a provádění akcí atd.
- Několik tvrzení o názvu okna, adresách URL atd., Které lze provést v instanci ovladače.
Budeme vytvářet instanci ChromeWebdriver v souboru Step Implementations.
Vytvořme si tedy soubor definice kroku. Jak jsme viděli v minulém článku, Specflow poskytuje mechanismus pro automatické generování definic kroku (které lze později přizpůsobit / upravit podle potřeby).
- Přejděte do souboru funkcí, klepněte pravým tlačítkem a vyberte „Generovat definice kroku“.
- Vytvořte nový soubor ve složce StepDefinitions, jak jsme vytvořili dříve, a pojmenujte soubor jako YoutubeSearchFeatureSteps.cs
- Zajistěte, aby všechny kroky scénáře byly správně svázány s definicemi kroku.
Tip - Úpravy definic automaticky generovaných kroků:
Nyní, pokud pečlivě sledujete, definice kroku, která se vygenerovala pro náš krok klíčového slova pro vyhledávání, tj. „Zadal jsem Indii jako klíčové slovo pro vyhledávání“, automaticky generovaný kód, neidentifikuje / neoddělí klíčové slovo pro vyhledávání, a proto jej neparametizuje.
(Given(@&'I have entered India as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword() { ScenarioContext.Current.Pending(); }
Ale to není to, co chceme. Potřebujeme, aby klíčové slovo pro vyhledávání bylo parametrizováno, jinak pro každé vyhledávání klíčových slov budeme muset vytvořit vlastní definici kroku.
Podívejme se tedy, jak upravit tuto definici kroku na obecnější, což umožní parametrizovat klíčové slovo pro vyhledávání. To lze provést pomocí jednoduchého porovnávače regulárních výrazů.
Viz níže uvedený ukázkový kód. Nahradili jsme klíčové slovo pro vyhledávání pomocí shody regex, tj. „ (. *) „To udělá to, že nahradí hodnotu jakéhokoli klíčového slova, které předáte ze scénáře, a nastaví hodnotu klíčového slova pro vyhledávání ve vstupním parametru s názvem„ searchString “v níže uvedeném ukázce kódu.
(Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { ScenarioContext.Current.Pending() }
Tímto způsobem udržuje kód modulární a vyhne se opakovanému kódu typového štítku pro každou implementaci kroku.
Integrace selenu a logika definice kroku
Nyní se podívejme na skutečnou integraci selenu se Specflow. Jakmile se vygenerují definice kroku, přidáme k nim nyní kód, abychom mohli provést skutečný testovací scénář.
Podívejme se, kam můžeme umístit a inicializovat instanci ovladače Selenium Web tak, aby byla k dispozici po celou dobu provádění scénáře. Ovladač umístíme jako soukromé pole vygenerované třídy vazby. Ovladač bude inicializován jako součást konstruktoru třídy.
Tímto způsobem ovladač zůstane inicializován po celou dobu trvání testu, protože máme pouze jeden vazební soubor pro všechny kroky (a bude inicializován před zahájením provádění testu).
Všimněte si také, že budeme také implementovat IDisposable rozhraní, aby se odstranila instance ovladače, po které již není vyžadována. Umístění do metody Dispose () zaručí, že jakmile bude objekt třídy vyřazen, může být vyřazena také instance ovladače.
Takto vypadá kód pro deklaraci a inicializaci instance 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; } } }
S výše uvedeným lze instanci ovladače použít jako součást jakékoli implementace Step, která je součástí spuštění scénáře.
Podívejme se nyní na krokovou implementaci každého jednotlivého scénáře.
# 1) Uspořádejte kroky:
Given I have navigated to youtube website And I have entered India as search keyword
Oba tyto kroky zahrnují interakci s instancí ovladače. Prvním otevřeným krokem je okno prohlížeče a přejde na web youtube
Druhý krok hledá tlačítko pro zadávání vyhledávání a jako klíčové slovo pro vyhledávání zadá „Indie“.
Níže je implementace pro oba tyto kroky:
((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); }
U prvního kroku si všimněte tvrzení, které zajišťuje, že navigace na youtube byla úspěšná, a to kontrolou názvu okna.
Poznámka: Mohou existovat různé způsoby umisťování tvrzení na různé webové prvky nebo vlastnosti ovladače, ale konečným cílem tohoto kurzu je jen ilustrovat nejjednodušším způsobem.
Ve druhém kroku jsme přidali dynamické čekání pomocí Očekávané podmínky což zajistí, že vyhledávací pole bude viditelné dříve, než se kód pokusí zadat klíčové slovo pro vyhledávání.
Také ukládáme řetězec searchString do a vyhledávání v soukromém poli To se provádí tak, že searchKeyword lze použít i v jiných implementacích Step.
Tip - předávání údajů v krocích
Předávání / ukládání dat tímto přístupem (tj. Prostřednictvím proměnných třídy) je jedním z prostředků, pomocí kterých lze data sdílet mezi vazbami Step.
Existují i jiné způsoby, jak to udělat, stejně jako samotný Specflow poskytuje objekt Dynamic Dictionary Object s názvem ScenarioContext. Více podrobností o tom uvidíme v nadcházejících článcích.
# 2) Jednejte krok
When I press the search button
Nyní se podívejme na skutečnou akci, kterou je kliknutí na tlačítko Hledat. Soubor implementace kroku vyhledá vyhledávací tlačítko a klikne na něj, aby provedl krok scénáře.
Kód tohoto kroku vypadá takto:
(When(@'I press the search button')) public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); }
# 3) Nakonec krok prosazení:
Then I should navigate to search results page
V tomto kroku pouze ověřujeme z vlastností ovladače, zda adresa URL a název stránky obsahují klíčové slovo pro vyhledávání nebo ne.
Kód tohoto kroku je uveden níže:
(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)); }
Provedení
Zkusme nyní provést scénář a zobrazit výsledky. Po provedení scénáře budou postupně provedeny všechny kroky scénáře. Testem bude otevření prohlížeče, navigace na web a následné provedení určité akce.
Výstup testu lze zobrazit kliknutím na tlačítko „Výstup“ ze shrnutí testu, které ukazuje úspěch / neúspěch každého jednotlivého kroku.
Tipy
Mezilehlé neúspěšné kroky
V případě scénáře, který má přechodné kroky, které selhaly, mějte na paměti, že v těchto scénářích Specflow jednoduše neprovede žádné zbývající kroky tohoto scénáře a označí výsledek testu jako neúspěšný.
Spouštění testů s adaptérem NUnit
V tomto příkladu jsme provedli naše testy pomocí testovacího běžece Specflow.NUnit (který jsme nainstalovali přes Nuget Package Manager).
Toto se liší několika způsoby, jak ukazuje níže běžec Specrun, který jsme použili v předchozím článku.
- Specflow.NUnit runner je open source.
- Nezavádí žádné zpoždění při provádění testů.
Závěr
V tomto článku jsme viděli úplný příklad integrace selenu s rozhraním Specflow prostřednictvím jednoduchého testovacího scénáře vyhledávání videa v aplikaci Youtube.
Při integraci selenu jsme také prošli, jak sdílet data napříč různými vazbami prostřednictvím soukromých polí třídy. Pokryli jsme také spuštění testu na NUnit runner Vs Specrun runner a oba jsme podrobně porovnali.
Soubory kódu
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; } } } }
Podívejte se na náš nadcházející výukový program a dozvíte se více o sdílených a oborových vazbách, hácích a opětovném použití ve Specflow!
Výukový program PREV | DALŠÍ výuka
Doporučené čtení
- Cucumber Selenium Tutorial: Cucumber Java Selenium WebDriver Integration
- Úvod do Selenium WebDriver - Selenium Tutorial # 8
- Integrace Jenkins s Selenium WebDriver: Podrobný návod
- Implementace našeho prvního skriptu WebDriver - výuka selenu WebDriver # 10
- Jak zacházet s výstrahami / vyskakovacími okny v Selenium WebDriver - Selenium Tutorial # 16
- Kompletní nastavení a instalace WebDriveru s Eclipse - výuka selenu č. 9
- Zkontrolujte viditelnost webových prvků pomocí různých typů Příkazy WebDriver - Selenium Tutorial # 14
- Výukový program GeckoDriver Selenium: Jak používat GeckoDriver v selenových projektech