specflow selenium webdriver end end example
End to End Eksempel på bruk av Specflow & Selen Webdriver:
I dette Gratis Specflow Training Series , til Kort introduksjon om Specflow ble gitt i vår forrige opplæring.
I denne artikkelen vil vi se et eksempel på å bruke Specflow-baserte BDD-spesifikasjoner, og testene vil bli utført via Selenium Webdriver.
Testene kan være så enkle som å teste innloggingsfunksjonaliteten til et program. Det er bare det at vi vil beskrive disse testene ved hjelp av Specflow, og trinnimplementeringene vil bruke Selen-driver og kommandoer og NUnit som påstandsrammeverk.
Vi vil også bruke NUnit-basert Specflow runner (i motsetning til Specrun som ikke er åpen kildekode og introduserer en tilfeldig forsinkelse i gratisversjonen).
Hva du vil lære:
Videoopplæring: Specflow og Selen
Se videoopplæringen om Specflow og Selen:
hvordan finne xpath i krom for selen
La oss komme i gang.
For å komme i gang, la oss lage et enhetstestprosjekt i Visual Studio og installere følgende forutsetninger:
# 1) Opprett et enhetstestprosjekt
Installer Nuget-pakken for Nunit og Specflow.
Install-Package Specflow.NUnit
# 2) Installer Seleniums Webdriver for Chrome-nettleser.
Dette kan også installeres via Nuget Package Manager-konsollen gjennom kommandoen nedenfor.
Install-Package Selenium.WebDriver.ChromeDriver
# 3) Installer Selenium Webdriver-biblioteker og Selenium Wait Helpers for å legge til ExpectedCondition-venter.
Install-Package Selenium.WebDriver Install-Package DotNetSeleniumExtras.WaitHelpers
# 4) Fjern nå test.cs-filen fra prosjektet som er automatisk opprettet.
Vi gjør dette trinnet for å unngå forvirring, ettersom vi bruker funksjonsfiler og trinndefinisjonsfiler for Specflow.
# 5) Opprett mapper for funksjoner og trinndefinisjoner for å lagre implementeringsfiler for funksjoner og trinndefinisjoner.
Dette er ikke et obligatorisk trinn, men er nyttig for å organisere funksjonene og trinnimplementeringene i separate mapper.
# 6) På slutten av trinnene ovenfor skal løsningsstrukturen og pakkene. Config se ut som vist nedenfor.
Funksjon og trinnimplementering
La oss nå komme i gang med funksjonsfilen og den faktiske trinnimplementeringen.
Om funksjonen - Eksempelfunksjonen vil være å teste / validere søkefunksjonaliteten til Youtube-nettstedet. Vi vil søke etter et nøkkelord og hevde at brukeren ble omdirigert til søkeresultatsiden.
Legg til en ny funksjonsfil og gi den navnet YoutubeSearchFeature.feature
Legg til et søkefunksjonsscenario og funksjonsbeskrivelse som vist nedenfor:
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
Ovennevnte scenario forventer at testen skal:
- Naviger til Youtube-nettstedet: Dette vil kreve et rammeverk for nettautomatisering som Selenium, som vil bruke en Webdriver til å navigere til en webside i en nettleser.
- Søk etter et nøkkelord: Dette trinnet vil innebære å lete etter passende inngangselementer og knapper for å taste inn nøkkelordet og utføre søket henholdsvis.
- Påstå at søkeresultatene vises, og at brukeren er på resultatsiden: Dette trinnet vil innebære påstander om å verifisere om brukeren havnet på riktig side.
La oss nå se trinnimplementeringene hver av trinnene.
Før det, la oss forstå hvordan vi skal integrere Selen-logikk / kode i den eksisterende Specflow-definisjonen.
Selen eller noe annet verktøy (eller enhetstesting stokker / mocks / drivere osv.) er egentlig en mellomliggende del av trinnutførelsen, men det viktigste å forstå er måten å integrere begge disse rammene.
Med Specflow kan brukere skrive testspesifikasjoner. Det dikterer ikke verktøyet som skal brukes. Derfor står testutvikleren fritt til å velge så mange testverktøy som han vil være avhengig av brukssaken som blir løst.
For å kunne bruke Selen i dette scenariet trenger vi følgende:
- En forekomst av WebDriver (vi bruker ChromeDriver for enkelhets skyld), som gjør det mulig for brukeren å faktisk navigere til websiden ved hjelp av en nettleser i henhold til driverimplementering.
- Få WebElement-erklæringer (og kan bare gjøres som en del av trinnimplementeringer) som kreves for å samhandle med brukeren og sende innganger og utføre handlinger etc.
- Få påstander om vinduetittel, urls osv. Som kan utføres på driverinstans.
Vi oppretter en forekomst av ChromeWebdriver i Step Implementations-filen.
La oss derfor opprette trinndefinisjonsfilen. Som vi så i forrige artikkel, gir Specflow en mekanisme for å automatisk generere trinndefinisjonene (som senere kan tilpasses / endres etter behov).
- Naviger til funksjonsfilen, høyreklikk og velg 'Generer trinndefinisjoner'.
- Opprett en ny fil i StepDefinitions-mappen som vi opprettet tidligere, og gi filen navnet YoutubeSearchFeatureSteps.cs
- Forsikre deg om at alle trinnene i scenariet er bundet til trinndefinisjonene på riktig måte.
Tips - Endring av autogenererte trinndefinisjoner:
Nå hvis du nøye observerer, identifiserer / skiller ikke trinndefinisjonen som ble generert for søkeordet vårt i søkeordet, dvs. 'Jeg har angitt India som søkeord', den automatisk genererte koden, søkeordet, og det parameteriserer det derfor ikke.
(Given(@&'I have entered India as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword() { ScenarioContext.Current.Pending(); }
Men dette er ikke det vi ønsker. Vi trenger at søkeordet skal parametreres, ellers må vi opprette en tilpasset trinndefinisjon for hvert søkeordssøk.
Så la oss se hvordan du endrer denne trinndefinisjonen til en mer generisk, som gjør det mulig å parametere søkeordet. Dette kan gjøres gjennom enkel regex-matcher.
Se nedenstående kodeeksempel. Vi har erstattet søkeordet gjennom en regex-matcher, dvs. (. *) ”Hva dette vil gjøre er at det vil erstatte verdien på ethvert nøkkelord som du vil sende fra scenariet, og vil sette verdien på søkeordet i inndataparameteren kalt“ searchString ”i nedenstående kodeeksempel.
(Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { ScenarioContext.Current.Pending() }
På denne måten holder den koden modulær og unngår gjentatt kjeleplatekode for hver trinnimplementering.
Selenintegrasjon og trinndefinisjonslogikk
La oss nå se den faktiske integrasjonen av Selenium med Specflow. Når trinndefinisjonene er generert, legger vi nå til kode for å utføre selve testscenariet.
La oss se hvor vi kan plassere og initialisere Selenium-driverforekomsten slik at den er tilgjengelig gjennom hele scenarikjøringen. Vi vil plassere sjåføren som et privat felt i den bindende klassen som ble generert. Føreren vil bli initialisert som en del av klassekonstruktøren.
På denne måten forblir driveren initialisert i løpet av testens varighet, ettersom vi bare har en bindingsfil for alle trinnene (og den blir initialisert før testutførelsen starter).
Vær også oppmerksom på at vi også vil implementere ID disponibel grensesnitt for å avhende driverforekomsten, etter som den ikke lenger er nødvendig. Å plassere den i Dispose () -metoden vil garantere at når klassens Objekt blir kvitt, kan sjåførinstansen også kastes.
Slik ser koden for erklæring og initialisering av WebDriver-forekomst 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 det ovennevnte kan driverinstansen brukes som en del av hvilken som helst trinnimplementering som er en del av scenarioutførelsen.
La oss nå se trinnimplementeringen av hvert enkelt scenario.
# 1) Ordne trinn:
Given I have navigated to youtube website And I have entered India as search keyword
Begge disse trinnene innebærer samhandling med driverinstansen. Det første trinnet åpner nettleservinduet og navigerer til youtube-nettstedet
Det andre trinnet ser etter knapp for søkeinngang og skriver inn 'India' som søkeordet.
Nedenfor er implementeringen for begge disse trinnene:
((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); }
For det første trinnet, legg merke til påstanden om at den sikrer at navigeringen til youtube var vellykket ved å sjekke vinduetittelen.
Merk: Det kan være forskjellige måter å plassere påstander på forskjellige webelementer eller driveregenskaper, men det endelige målet med denne opplæringen er bare å illustrere med den mest forenklede måten.
I det andre trinnet har vi lagt til en dynamisk ventetid med ExpectedConditions som vil sikre at søkeboksen er synlig før koden prøver å taste søkeordet.
Vi lagrer også searchString i en privat feltsøk Nøkkelord. Dette gjøres slik at searchKeyword også kan brukes i andre trinnimplementeringer.
Tips - Overføring av data over trinnene
Å overføre / lagre data ved denne tilnærmingen (dvs. gjennom klassevariabler) er et av måtene data kan deles på tvers av trinnbindinger.
Det er andre måter å gjøre dette på, i tillegg til at Specflow i seg selv gir et dynamisk ordbokobjekt kalt ScenarioContext. Vi vil se mer detaljer om dette i de kommende artiklene.
# 2) Handle trinn
When I press the search button
La oss nå se på den faktiske handlingen, som klikker på Søk-knappen. Trinnimplementeringsfilen søker etter søkeknappen og klikker på den for å utføre scenario-trinnet.
Koden for dette trinnet ser ut som vist nedenfor:
(When(@'I press the search button')) public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); }
# 3) Til slutt Assert Step:
Then I should navigate to search results page
I dette trinnet bekrefter vi bare fra driveregenskapene om URL-adressen og sidetittelen inneholder søkeordet eller ikke.
Koden for dette trinnet er vist nedenfor:
(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)); }
Henrettelse
La oss nå prøve å utføre scenariet og se resultatene. Når scenariet er utført, vil alle trinnene utføres sekvensielt. Testen åpner en nettleser, navigerer til et nettsted og utfører deretter noen handlinger.
Resultatet av testen kan sees ved å klikke på “Output” -knappen fra testsammendraget som viser suksess / fiasko for hvert enkelt trinn.
Tips
Mellomliggende sviktende trinn
I tilfelle et scenario har mellomliggende trinn som mislykkes, vær oppmerksom på at i disse scenariene vil Specflow ganske enkelt ikke utføre gjenværende trinn i det scenariet, og vil markere resultatet av testen som mislykket.
hp alm intervju spørsmål og svar
Kjører tester med NUnit Adapter
For dette eksemplet har vi utført testene våre ved hjelp av Specflow.NUnit testløper (som vi hadde installert via Nuget Package Manager).
Dette er forskjellig på noen få måter som vist nedenfor fra Specrun-løperen som vi hadde brukt i den tidligere artikkelen.
- Specflow.NUnit runner er åpen kildekode.
- Det innfører ingen forsinkelser mens testene utføres.
Konklusjon
I denne artikkelen så vi et eksempel på å integrere selen med Specflow-rammeverk gjennom et enkelt testscenario for et videosøk på Youtube-applikasjonen.
Mens vi integrerte Selen, gikk vi også gjennom hvordan vi kan dele data på tvers av forskjellige bindinger gjennom private klassefelt. Vi dekket også kjøring av testen på NUnit-løper mot Specrun-løperen og sammenlignet begge i detalj.
Kodefiler
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 kommende veiledning for å lære mer om Shared & Scoped Bindings, Hooks and Step Reuse in Specflow!
PREV Opplæring | NESTE veiledning
Anbefalt lesing
- Agurk Selen Tutorial: Agurk Java Selen WebDriver Integration
- Introduksjon til Selenium WebDriver - Selenium Tutorial # 8
- Integrasjon av Jenkins med Selenium WebDriver: trinnvis veiledning
- Implementering av vårt første WebDriver Script - Selenium WebDriver Tutorial # 10
- Hvordan håndtere varsler / popup-vinduer i Selen WebDriver - Selen-opplæring nr. 16
- WebDriver Hele installasjonen og installasjonen med Eclipse - Selenium Tutorial # 9
- Kontroller synligheten til nettelementer ved hjelp av forskjellige typer WebDriver-kommandoer - Selenium-veiledning nr. 14
- GeckoDriver Selenium-opplæring: Hvordan bruke GeckoDriver i Selen-prosjekter