specflow selenium webdriver end end example
Exemple d'extrem a extrem d'utilitzar Specflow i Selenium Webdriver:
En aquest Sèrie d'entrenament de Specflow gratuïta , a Breu introducció a Specflow es va donar al nostre tutorial anterior.
En aquest article, veurem un exemple extrem a extrem d’utilitzar les especificacions BDD basades en Specflow i les proves s’executaran mitjançant Selenium Webdriver.
Les proves poden ser tan senzilles com provar la funcionalitat d'inici de sessió d'una aplicació. Només això, descriurem aquestes proves mitjançant Specflow i les implementacions Step faran servir el control i les ordres de Selenium i NUnit com a marc d’asserció.
També utilitzarem el corredor Specflow basat en NUnit (a diferència de Specrun que no és de codi obert i introdueix un retard aleatori a la versió gratuïta).
Què aprendreu:
Video Tutorial: Specflow i Selenium
Mireu el vídeo tutorial sobre Specflow i Selenium:
com fer proves de penetració per a un lloc web
Comencem.
Per començar, creem un Project Unit test a Visual Studio i instal·lem els requisits previs següents:
# 1) Creeu un projecte de prova unitària
Instal·leu el paquet Nuget per a Nunit i Specflow.
Install-Package Specflow.NUnit
# 2) Instal·leu el controlador web de Selenium per al navegador Chrome.
Això també es pot instal·lar mitjançant la consola Nuget Package Manager mitjançant l'ordre següent.
Install-Package Selenium.WebDriver.ChromeDriver
# 3) Instal·leu biblioteques Selenium Webdriver i Selenium Wait Helpers per afegir ExpectedCondition espera.
Install-Package Selenium.WebDriver Install-Package DotNetSeleniumExtras.WaitHelpers
# 4) Ara traieu el fitxer test.cs del projecte que s'ha creat automàticament.
Fem aquest pas per evitar confusions, ja que utilitzarem fitxers de funcions i fitxers de definició de passos per a Specflow.
# 5) Creeu carpetes per a funcions i definicions de passos per emmagatzemar fitxers d'implementació de definicions de funcions i passos.
Aquest no és un pas obligatori, però és útil per organitzar les funcions i les implementacions de passos en carpetes separades.
# 6) Al final dels passos anteriors, l'estructura de la solució i el package.config haurien de ser els següents:
Implementació de funcions i passos
Comencem ara amb el fitxer de funcions i la implementació del pas real.
Quant a la funció - La funció de mostra serà provar / validar la funcionalitat de cerca del lloc web de Youtube. Cercarem una paraula clau i afirmarem que l’usuari ha estat redirigit a la pàgina de resultats de la cerca.
Afegiu un fitxer de funcions nou i nomeneu-lo com a YoutubeSearchFeature.feature
Afegiu un escenari de funcions de cerca i una descripció de les funcions com es mostra a continuació:
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
L'escenari anterior espera que la prova:
- Aneu al lloc web de Youtube: Això requerirà un marc d’automatització web com Selenium, que utilitzarà un controlador web per navegar a una pàgina web d’un navegador.
- Cerqueu una paraula clau: Aquest pas consistirà a buscar elements i botons d'entrada adequats per introduir la paraula clau i executar la cerca respectivament.
- Assegureu-vos que es mostren els resultats de la cerca i que l'usuari es troba a la pàgina de resultats: Aquest pas implicarà afirmacions sobre la verificació de si l’usuari ha aterrat a la pàgina correcta.
Ara vegem les implementacions de Step cadascun dels passos.
Abans d’això, comprenguem com integrarem la lògica / codi de seleni a la definició existent de Specflow.
Seleni o qualsevol altra eina (o unitats de prova d'unitats / simulacres / controladors, etc.) són essencialment una part intermèdia de l'execució de passos, però el més important a entendre és la manera d'integrar aquests dos marcs.
Specflow permet als usuaris escriure especificacions de prova. No dicta l'eina que s'hauria d'utilitzar. Per tant, el desenvolupador de proves pot escollir lliurement tantes eines de prova com vulgui dependre del cas d’ús que s’estigui resolent.
Per utilitzar Selenium en aquest escenari, necessitem el següent:
- Una instància de WebDriver (utilitzarem ChromeDriver per simplificar-la), que permetrà a l’usuari navegar fins a la pàgina web mitjançant un navegador segons la implementació del controlador.
- Poques declaracions de WebElement (i només es poden fer com a part de les implementacions de Step) que són necessàries per interactuar amb l’usuari i passar entrades i realitzar accions, etc.
- Poques afirmacions sobre el títol de la finestra, les URL, etc. que es poden executar en la instància del controlador.
Crearem una instància de ChromeWebdriver al fitxer Implementacions de passos.
Per tant, creem el fitxer Definició de passos. Com vam veure a l’últim article, Specflow proporciona un mecanisme per generar automàticament les definicions de pas (que posteriorment es poden personalitzar / modificar segons es requereixi).
- Aneu al fitxer de funcions, feu clic amb el botó dret i seleccioneu 'Genera definicions de pas'.
- Creeu un fitxer nou a la carpeta StepDefinitions tal com hem creat anteriorment i bategeu-lo amb el nom de YoutubeSearchFeatureSteps.cs
- Assegureu-vos que tots els passos de l'escenari estiguin lligats a les definicions de pas adequadament.
Consell: modificació de les definicions de pas generades automàticament:
Ara bé, si observeu detingudament, la definició del pas que es va generar per al pas de paraula clau de cerca, és a dir, 'He introduït l'Índia com a paraula clau de cerca' el codi generat automàticament, no identifica / separa la paraula clau de cerca i, per tant, no la parametritza.
(Given(@&'I have entered India as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword() { ScenarioContext.Current.Pending(); }
Però això no és el que volem. Necessitem parametritzar la paraula clau de cerca, en cas contrari, per a cada cerca de paraules clau, haurem de crear una definició de pas personalitzada.
Per tant, vegem, com es modifica aquesta definició de pas per una de més genèrica, que permetrà parametritzar la paraula clau de cerca. Això es pot fer mitjançant un simple ajustador de regla.
Consulteu el següent exemple de codi. Hem substituït la paraula clau de cerca per un ajustador regular (és a dir, ' (. *) ”El que farà és que substituirà el valor de qualsevol paraula clau que passareu de l’escenari i establirà el valor de la paraula clau de cerca al paràmetre d’entrada anomenat“ searchString ”al següent codi de mostra.
(Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { ScenarioContext.Current.Pending() }
D'aquesta manera, manté el codi modular i evita repetir el codi de la caldera per a cada implementació del pas.
Integració de seleni i lògica de definició de passos
Ara vegem la integració real de Selenium amb Specflow. Un cop generades les definicions de passos, ara els afegirem codi per tal d’executar l’escenari de prova real.
A veure, on podem col·locar i inicialitzar la instància del controlador Selenium Web perquè estigui disponible durant tota l’execució de l’escenari. Situarem el controlador com a camp privat de la classe vinculant que es va generar. El controlador s’inicialitzarà com a part de la classe Constructor.
D'aquesta manera, el controlador es manté inicialitzat durant tot el transcurs de la prova, ja que només tenim un fitxer Binding per a tots els passos (i s'inicialitza abans que comenci l'execució de la prova).
Tingueu en compte també que també implementarem el IDesponible interfície, per tal de desfer la instància del controlador després de la qual ja no és necessària. Si el col·loqueu al mètode Dispose (), es garantirà que un cop eliminat l’objecte de la classe, també es pugui eliminar la instància del controlador.
Així és com es veu el codi per a la declaració i inicialització de la instància de 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; } } }
Amb l'anterior, la instància del controlador es pot utilitzar com a part de qualsevol implementació de pas que formi part de l'execució de l'escenari.
Vegem ara la implementació del pas de cada escenari individual.
# 1) Organitzeu els passos:
Given I have navigated to youtube website And I have entered India as search keyword
Aquests dos passos consisteixen a interactuar amb la instància del controlador. El primer pas obre la finestra del navegador i navega fins al lloc web de youtube
El segon pas busca el botó d'entrada de la cerca i introdueix 'Índia' com a paraula clau de cerca.
A continuació es mostra la implementació d’aquests dos passos:
((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); }
Per al primer pas, observeu l'afirmació que assegura que la navegació a youtube ha estat correcta comprovant el títol de la finestra.
Nota: Hi pot haver diverses maneres de col·locar afirmacions en diferents elements web o propietats del controlador, però l'objectiu final d'aquest tutorial és només il·lustrar de la manera més senzilla.
Al segon pas, hem afegit una espera dinàmica mitjançant Condicions esperades que assegurarà que el quadre de cerca sigui visible abans que el codi intenti introduir la paraula clau de cerca.
A més, estem emmagatzemant la cercaString en un fitxer cerca de camp privat Paraula clau. Això es fa perquè la paraula clau de cerca també es pugui utilitzar en altres implementacions de Step.
Consell: transmetre dades pels passos
Passar / emmagatzemar dades mitjançant aquest enfocament (és a dir, mitjançant variables de classe) és un dels mitjans a través dels quals es poden compartir dades entre les vinculacions de passos.
Hi ha altres maneres de fer-ho, de la mateixa manera que Specflow proporciona un objecte de diccionari dinàmic anomenat ScenarioContext. Veurem més detalls al respecte en els propers articles.
# 2) Pas de l'acte
When I press the search button
Vegem ara l’acció real, que fa clic al botó Cerca. El fitxer d'implementació de passos cercarà el botó de cerca i hi farà clic per executar el pas de l'escenari.
El codi per a aquest pas és el següent:
(When(@'I press the search button')) public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); }
# 3) Finalment, assegureu el pas:
Then I should navigate to search results page
En aquest pas, només comprovem des de les propietats del controlador si l’URL i el títol de la pàgina contenen o no la paraula clau de cerca.
A continuació es mostra el codi d’aquest pas:
(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)); }
Execució
Ara, intentem executar l’escenari i veure els resultats. Un cop executat l’escenari, s’executaran tots els passos de l’escenari de manera seqüencial. La prova obrirà un navegador, anirà a un lloc web i, a continuació, realitzarà alguna acció.
La sortida de la prova es pot veure fent clic al botó 'Sortida' del resum de la prova, que mostra l'èxit / fracàs de cada pas individual.
Consells
Passos intermedis fallits
En cas que un escenari tingui passos intermedis que es produeixin un error, tingueu en compte que en aquests escenaris Specflow simplement no executarà els passos restants d'aquest escenari i marcarà el resultat de la prova com a fallit.
preguntes d’entrevistes de seleni fetes a les empreses
Execució de proves amb l'adaptador NUnit
Per a aquest exemple, hem executat les nostres proves amb el corredor de prova Specflow.NUnit (que havíem instal·lat a través del gestor de paquets Nuget).
Això és diferent en alguns aspectes, tal com es mostra a continuació, del corredor Specrun que havíem utilitzat a l'article anterior.
- El corredor Specflow.NUnit és de codi obert.
- No introdueix cap retard en executar les proves.
Conclusió
En aquest article, hem vist un exemple extrem a extrem d’integrar Selenium amb el framework Specflow mitjançant un escenari de prova senzill d’una cerca de vídeo a l’aplicació Youtube.
Mentre integràvem Selenium, també vam examinar com compartir dades entre diferents enllaços a través de camps de classes privades. També vam tractar d'executar la prova al corredor NUnit contra el corredor Specrun i vam comparar tots dos en detall.
Fitxers de codi
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; } } } }
Mireu el nostre proper tutorial per obtenir més informació sobre enquadernacions, ganxos i reutilització compartits i abastats a Specflow.
PREV Tutorial | NEXT Tutorial
Lectura recomanada
- Tutorial de Cogombre Selenium: Integració de Cogombre Java Selenium WebDriver
- Introducció a Selenium WebDriver - Tutorial Selenium # 8
- Integració de Jenkins amb Selenium WebDriver: tutorial pas a pas
- Implementació del nostre primer script WebDriver - Selenium WebDriver Tutorial # 10
- Com gestionar les alertes / finestres emergents a Selenium WebDriver - Selenium Tutorial # 16
- Configuració i instal·lació senceres de WebDriver amb Eclipse - Tutorial Selenium # 9
- Comproveu la visibilitat dels elements web mitjançant diversos tipus d’ordres de WebDriver - Tutorial Selenium núm. 14
- Tutorial de GeckoDriver Selenium: Com utilitzar GeckoDriver en projectes de Selenium