specflow selenium webdriver end end example
End to End Exempel på användning av Specflow & Selen Webdriver:
I denna Gratis Specflow-träningsserie , till Kort introduktion på Specflow gavs i vår tidigare handledning.
I den här artikeln kommer vi att se ett slut-till-slut-exempel på att använda Specflow-baserade BDD-specifikationer och testerna kommer att utföras via Selenium Webdriver.
Testerna kan vara så enkla som att testa inloggningsfunktionaliteten för en applikation. Det är bara det, vi kommer att beskriva dessa tester med hjälp av Specflow och stegimplementeringarna kommer att använda Selenium-drivrutiner och kommandon och NUnit som påståendram.
Vi kommer också att använda NUnit-baserade Specflow-löpare (i motsats till Specrun som inte är öppen källkod och introducerar en slumpmässig fördröjning i gratisversionen).
Vad du kommer att lära dig:
Videohandledning: Specflow och Selen
Titta på videohandledningen om Specflow och Selen:
hur man kör en swf-fil i krom
Låt oss börja.
För att komma igång, låt oss skapa ett enhetstestprojekt i Visual Studio och installera följande förutsättningar:
# 1) Skapa ett enhetstestprojekt
Installera Nuget-paketet för Nunit och Specflow.
Install-Package Specflow.NUnit
# 2) Installera Seleniums Webdriver för Chrome-webbläsare.
Detta kan också installeras via Nuget Package Manager-konsolen via kommandot nedan.
Install-Package Selenium.WebDriver.ChromeDriver
# 3) Installera Selenium Webdriver-bibliotek och Selenium Wait Helpers för att lägga till ExpectedCondition-väntan.
Install-Package Selenium.WebDriver Install-Package DotNetSeleniumExtras.WaitHelpers
# 4) Ta nu bort test.cs-filen från projektet som skapas automatiskt.
Vi gör detta steg för att undvika förvirring eftersom vi kommer att använda funktionsfiler och stegdefinitionsfiler för Specflow.
# 5) Skapa mappar för funktioner och stegdefinitioner för att lagra funktions- och stegdefinitionsfiler.
Detta är inte ett obligatoriskt steg men är användbart för att organisera funktioner och stegimplementeringar i separata mappar.
# 6) I slutet av ovanstående steg ska lösningsstrukturen och package.config se ut som visas nedan.
Funktion för funktion och steg
Låt oss nu komma igång med funktionsfilen och den faktiska stegimplementeringen.
Om funktionen - Exempelfunktionen kommer att testa / validera sökfunktionen på Youtube-webbplatsen. Vi kommer att söka efter ett nyckelord och hävda att användaren omdirigerades till sökresultatsidan.
Lägg till en ny funktionsfil och namnge den som YoutubeSearchFeature.feature
Lägg till ett sökfunktionsscenario och funktionsbeskrivning som visas nedan:
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
Ovanstående scenario förväntar sig att testet:
- Navigera till Youtube-webbplatsen: Detta kräver ett ramverk för webbautomation som Selenium, som använder en Webdriver för att navigera till en webbsida i en webbläsare.
- Sök efter ett nyckelord: Detta steg innebär att leta efter lämpliga inmatningselement och knappar för att mata in nyckelordet och utföra sökningen respektive.
- Påstå att sökresultaten visas och att användaren är på resultatsidan: Detta steg kommer att innebära påståenden om att verifiera om användaren hamnade på rätt sida.
Låt oss nu se stegimplementeringarna vart och ett av stegen.
Innan det, låt oss förstå hur vi kommer att integrera Selen-logik / kod i den befintliga Specflow-definitionen.
Selen eller något annat verktyg (eller enhetstestning / mocks / drivrutiner etc) är i huvudsak en mellanliggande del av stegutförandet, men det viktigaste att förstå är sättet att integrera båda dessa ramar.
Specflow gör det möjligt för användare att skriva testspecifikationer. Det dikterar inte verktyget som ska användas. Därför är testutvecklaren fri att välja så många testverktyg som han vill bero på användningsfallet som löses.
För att kunna använda Selen i detta scenario behöver vi följande:
- En instans av WebDriver (vi använder ChromeDriver för enkelhetens skull), vilket gör det möjligt för användaren att faktiskt navigera till webbsidan med en webbläsare enligt drivrutinsimplementeringen.
- Få WebElement-deklarationer (och kan endast göras som en del av stegimplementeringar) som krävs för att interagera med användaren och skicka ingångar och utföra åtgärder etc.
- Få påståenden om fönstertitel, webbadresser, etc som kan köras på drivrutinsinstans.
Vi kommer att skapa en instans av ChromeWebdriver i Step Implementations-filen.
Låt oss därför skapa stegdefinitionsfilen. Som vi såg i den senaste artikeln tillhandahåller Specflow en mekanism för att automatiskt generera stegdefinitionerna (som senare kan anpassas / modifieras efter behov).
- Navigera till funktionsfilen, högerklicka och välj “Generate Step Definitions”.
- Skapa en ny fil i StepDefinitions-mappen som vi skapade tidigare och namnge filen som YoutubeSearchFeatureSteps.cs
- Se till att alla steg i scenariot har varit bundet till stegdefinitionerna på lämpligt sätt.
Tips - Ändra autogenererade stegdefinitioner:
Om du nu noggrant observerar, identifierar / separerar inte stegdefinitionen som genererades för vårt sökordsteg, dvs. 'Jag har angett Indien som sökord', den automatiskt genererade koden, sökordet och därför parametrerar det inte.
(Given(@&'I have entered India as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword() { ScenarioContext.Current.Pending(); }
Men det här är inte vad vi vill ha. Vi behöver att sökordet ska parametreras, annars måste vi skapa en anpassad stegdefinition för varje nyckelordssökning.
Så, låt oss se, hur man ändrar denna stegdefinition till en mer generisk, vilket gör det möjligt att parametrisera sökordet. Detta kan göras genom enkel regex matcher.
Se nedanstående kodexempel. Vi har ersatt sökordet genom en regex-matchare, dvs. (. *) ”Vad detta kommer att göra är att det kommer att ersätta värdet för alla nyckelord som du skickar från scenariot och ställer in värdet för sökordet i inmatningsparametern med namnet“ searchString ”i nedanstående kodexempel.
(Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { ScenarioContext.Current.Pending() }
På så sätt håller den koden modulär och undviker upprepad pannkodskod för varje stegimplementering.
Selenintegration och stegdefinitionslogik
Låt oss nu se den faktiska integrationen av Selenium med Specflow. När stegdefinitionerna har genererats lägger vi nu till kod för dem för att utföra själva testscenariot.
Låt oss se, där vi kan placera och initiera Selenium-drivrutinsinstansen så att den är tillgänglig under hela Scenario-körningen. Vi kommer att placera föraren som ett privat fält i bindningsklassen som genererades. Föraren kommer att initieras som en del av klasskonstruktören.
På det här sättet förblir drivrutinen initialiserad under hela testets varaktighet eftersom vi bara har en bindningsfil för alla steg (och den initialiseras innan testkörningen startar).
Observera också att vi också kommer att implementera IDisposable gränssnitt för att avyttra drivrutinsinstansen efter vilken den inte längre behövs. Att placera den i bortskaffande () -metoden garanterar att när klassens objekt avyttras kan förarinstansen också kasseras.
Så här ser koden för deklaration och initialisering av WebDriver-instans ut:
(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; } } }
Med ovanstående kan drivrutinsinstansen användas som en del av varje stegimplementering som är en del av scenariotekvensen.
Låt oss nu se stegimplementeringen av varje enskilt scenario.
# 1) Ordna steg:
Given I have navigated to youtube website And I have entered India as search keyword
Båda dessa steg involverar interaktion med drivrutinsinstansen. Det första steget öppnar webbläsarfönstret och navigerar till youtube-webbplatsen
Det andra steget letar efter inmatningsknappen för sökning och anger 'Indien' som sökord.
Nedan följer implementeringen för båda dessa steg:
((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); }
Lägg märke till påståendet att det säkerställer att navigeringen till youtube lyckades genom att kontrollera fönstrets titel för det första steget.
Notera: Det kan finnas olika sätt att placera påståenden på olika webbelement eller drivrutinsegenskaper, men slutmålet med denna handledning är bara att illustrera med det mest förenklade sättet.
I det andra steget har vi lagt till en dynamisk väntan med ExpectedConditions vilket säkerställer att sökrutan är synlig innan koden försöker skriva in sökordet.
Vi lagrar också searchString i a privat fältsökningKeyword. Detta görs så att searchKeyword också kan användas i andra stegimplementeringar.
Tips - Skicka data över stegen
Att skicka / lagra data med detta tillvägagångssätt (dvs. genom klassvariabler) är ett av sätten genom vilket data kan delas över stegbindningar.
Det finns andra sätt att göra detta liksom att Specflow i sig ger ett Dynamic Dictionary Object som heter ScenarioContext. Vi kommer att se mer information om detta i de kommande artiklarna.
# 2) Handla steg
When I press the search button
Låt oss nu titta på den faktiska åtgärden, som klickar på Sök-knappen. Stegimplementeringsfilen söker efter sökknappen och klickar på den för att utföra scenaristeget.
Koden för detta steg ser ut som visas nedan:
(When(@'I press the search button')) public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); }
# 3) Slutligen påståendesteget:
Then I should navigate to search results page
I det här steget verifierar vi bara från Driveregenskaperna om URL och sidrubrik innehåller sökordet eller inte.
Koden för detta steg visas nedan:
(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)); }
Avrättning
Låt oss nu försöka genomföra scenariot och se resultaten. När scenariot har körts kommer alla scenariot att utföras sekventiellt. Testet öppnar en webbläsare, navigerar till en webbplats och utför sedan några åtgärder.
Testets resultat kan ses genom att klicka på “Output” -knappen från testsammanfattningen som visar framgång / misslyckande för varje enskilt steg.
Tips
Mellansteg som inte fungerar
Om ett scenario har mellanliggande steg som misslyckas, notera att i dessa scenarier kommer Specflow helt enkelt inte att utföra några återstående steg i det scenariot och kommer att markera resultatet av testet som misslyckat.
pl sql intervju frågor och svar pdf
Kör tester med NUnit Adapter
För detta exempel har vi kört våra tester med hjälp av Specflow.NUnit-testlöparen (som vi hade installerat via Nuget Package Manager).
Detta skiljer sig på några sätt som visas nedan från Specrun-löparen som vi använde i den tidigare artikeln.
- Specflow.NUnit runner är öppen källkod.
- Det medför inte någon fördröjning när testerna utförs.
Slutsats
I den här artikeln såg vi ett slut-till-slut-exempel på att integrera selen med Specflow-ramverk genom ett enkelt testscenario för en videosökning i Youtube-applikationen.
Medan vi integrerade Selen gick vi också igenom hur man delar data över olika bindningar genom privata klassfält. Vi täckte också att köra testet på NUnit-löparen mot Specrun-löparen och jämförde båda i detalj.
Kodfiler
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; } } } }
Se vår kommande handledning för att lära dig mer om Shared & Scoped Bindings, Hooks and Step Reuse in Specflow!
PREV-handledning | NÄSTA självstudie
Rekommenderad läsning
- Gurka Selen Tutorial: Gurka Java Selen WebDriver Integration
- Introduktion till Selen WebDriver - Selen Tutorial # 8
- Integration av Jenkins med Selen WebDriver: Steg-för-steg-handledning
- Implementering av vårt första WebDriver Script - Selenium WebDriver Tutorial # 10
- Hur man hanterar varningar / popup-fönster i Selen WebDriver - Selen Tutorial # 16
- WebDriver Hela installationen och installationen med Eclipse - Selen Tutorial # 9
- Kontrollera synligheten för webbelement med olika typer av WebDriver-kommandon - Selen Tutorial # 14
- GeckoDriver Selen Tutorial: Hur man använder GeckoDriver i Selen-projekt