specflow selenium webdriver end end example
Exemplu de la capăt la capăt de utilizare a Specflow & Selenium Webdriver:
In acest Seria de antrenament Specflow gratuită , la Scurtă introducere pe Specflow a fost dat în tutorialul nostru anterior.
În acest articol, vom vedea un exemplu extrem de final de utilizare a specificațiilor BDD bazate pe Specflow, iar testele vor fi executate prin Selenium Webdriver.
Testele ar putea fi la fel de simple ca testarea funcționalității de conectare a unei aplicații. Doar că, vom descrie aceste teste folosind Specflow și implementările Step vor folosi driverul și comenzile Selenium și NUnit ca cadru de afirmare.
Vom folosi, de asemenea, runner-ul Specflow bazat pe NUnit (spre deosebire de Specrun care nu este open source și introduce o întârziere aleatorie în versiunea gratuită).
Ce veți învăța:
Tutorial video: Specflow și Selenium
Urmăriți tutorialul video despre Specflow și Selenium:
echilibrarea încărcării routerului wireless WAN dual
Să începem.
Pentru a începe, să creăm un proiect de testare a unității în Visual Studio și să instalăm următoarele cerințe prealabile:
# 1) Creați un proiect de testare unitară
Instalați pachetul Nuget pentru Nunit și Specflow.
Install-Package Specflow.NUnit
# 2) Instalați Selenium’s Webdriver pentru browserul Chrome.
Acest lucru poate fi instalat și prin consola Nuget Package Manager prin comanda de mai jos.
Install-Package Selenium.WebDriver.ChromeDriver
# 3) Instalați bibliotecile Selenium Webdriver și Selenium Wait Helpers pentru adăugarea așteptărilor ExpectedCondition.
Install-Package Selenium.WebDriver Install-Package DotNetSeleniumExtras.WaitHelpers
# 4) Acum eliminați fișierul test.cs din proiectul care este creat automat.
Facem acest pas pentru a evita orice confuzie, deoarece vom folosi fișiere de caracteristici și fișiere de definire a pașilor pentru Specflow.
# 5) Creați foldere pentru caracteristici și definiții de pași pentru a stoca fișiere de implementare a definiției de caracteristici și pași.
Acesta nu este un pas obligatoriu, dar este util pentru a organiza caracteristicile și implementările de pași în foldere separate.
# 6) La sfârșitul pașilor de mai sus, structura soluției și package.config ar trebui să arate așa cum se arată mai jos.
Implementarea funcției și a etapelor
Acum, să începem cu fișierul de funcții și cu implementarea efectivă a pașilor.
Despre caracteristică - Funcția eșantion va fi de testare / validare a funcționalității de căutare a site-ului Youtube. Vom căuta un cuvânt cheie și vom afirma că utilizatorul a fost redirecționat către pagina cu rezultatele căutării.
Adăugați un nou fișier de caracteristici și denumiți-l ca YoutubeSearchFeature.feature
Adăugați un scenariu de funcționalitate de căutare și o descriere a funcției, așa cum se arată mai jos:
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
Scenariul de mai sus se așteaptă ca testul să:
- Navigați la site-ul Youtube: Acest lucru va necesita un cadru de automatizare web, cum ar fi Selenium, care va utiliza un Webdriver pentru a naviga la o pagină web dintr-un browser.
- Căutați un cuvânt cheie: Acest pas va presupune căutarea elementelor de intrare și a butoanelor adecvate pentru a introduce cuvântul cheie și, respectiv, a efectua căutarea.
- Afirmați că rezultatele căutării sunt afișate și că utilizatorul se află pe pagina cu rezultate: Acest pas va implica afirmații în jurul verificării dacă utilizatorul a aterizat pe pagina corectă.
Acum, să vedem implementările Step, fiecare dintre pași.
Înainte de asta, să înțelegem cum vom integra logica / codul Selenium în definiția existentă Specflow.
Seleniu sau orice alt instrument (sau unități de testare a unităților / simulărilor / driverelor etc.) sunt în esență o parte intermediară a Execuției pasului, dar elementul cheie de înțeles este modul de a integra ambele cadre.
Specflow permite utilizatorilor să scrie specificații de testare. Nu dictează instrumentul care ar trebui utilizat. Prin urmare, dezvoltatorul testului este liber să aleagă atâtea instrumente de testare pe cât dorește să depindă de cazul de utilizare care este rezolvat.
Pentru a utiliza Seleniu în acest scenariu, avem nevoie de următoarele:
- O instanță de WebDriver (vom folosi ChromeDriver pentru simplitate), care va permite utilizatorului să navigheze efectiv către pagina web utilizând un browser conform implementării Driverului.
- Puține declarații WebElement (și pot fi făcute doar ca parte a implementărilor Step) care sunt necesare pentru a interacționa cu utilizatorul și a transmite intrări și a efectua acțiuni etc.
- Puține afirmații despre titlul ferestrei, adresele URL etc. care pot fi executate pe instanța driverului.
Vom crea o instanță de ChromeWebdriver în fișierul Implementări pas.
Prin urmare, să creăm fișierul Definiție pas. După cum am văzut în ultimul articol, Specflow oferă un mecanism pentru generarea automată a definițiilor Pasului (care ulterior pot fi personalizate / modificate după cum este necesar).
- Navigați la fișierul de caracteristici, faceți clic dreapta și selectați „Generați definiții pas”.
- Creați un fișier nou în folderul StepDefinitions așa cum am creat mai devreme și denumiți fișierul ca YoutubeSearchFeatureSteps.cs
- Asigurați-vă că toți pașii scenariului au fost legați în mod corespunzător de definițiile pasului.
Sfat - Modificarea definițiilor pasului generate automat:
Acum, dacă observați cu atenție, definiția Pasului care a fost generată pentru pasul nostru de cuvânt cheie de căutare, adică „Am introdus India ca cuvânt cheie de căutare” codul generat automat, nu identifică / separă cuvântul cheie de căutare și, prin urmare, nu îl parametrizează.
(Given(@&'I have entered India as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword() { ScenarioContext.Current.Pending(); }
Dar nu asta vrem. Avem nevoie de parametrul cuvântului cheie de căutare, altfel, pentru fiecare căutare de cuvinte cheie, va trebui să creăm o definiție personalizată a Pasului.
Deci, să vedem, cum să modificați această definiție a pasului cu una mai generică, care va permite parametrizarea cuvântului cheie de căutare. Acest lucru se poate face printr-o simplă potrivire regex.
Consultați exemplul de cod de mai jos. Am înlocuit cuvântul cheie de căutare printr-o potrivire regex, adică „ (. *) ”Ceea ce va face este că va înlocui valoarea oricărui cuvânt cheie pe care îl veți trece din scenariu și va seta valoarea cuvântului cheie de căutare în parametrul de intrare numit„ searchString ”în exemplul de cod de mai jos.
(Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { ScenarioContext.Current.Pending() }
În acest fel, păstrează codul modular și evită codul repetat al cazanului pentru fiecare etapă de implementare.
Integrarea seleniului și logica de definire a pașilor
Acum să vedem integrarea efectivă a Selenium cu Specflow. Odată ce definițiile de pași sunt generate, acum le vom adăuga cod pentru a executa scenariul de testare reală.
Să vedem, unde putem plasa și inițializa instanța driverului Selenium Web, astfel încât să fie disponibilă pe tot parcursul execuției scenariului. Vom plasa Driverul ca un câmp privat al clasei de legare care a fost generat. Driverul va fi inițializat ca parte a clasei Constructor.
În acest fel, driverul rămâne inițializat pe întreaga durată a testului, deoarece avem doar un fișier de legare pentru toți pașii (și este inițializat înainte de începerea executării testului).
Rețineți, de asemenea, că vom implementa și fișierul IDisponibil interfață, astfel încât să eliminați instanța driverului după care nu mai este necesară. Plasarea acestuia în metoda Dispose () va garanta că odată ce obiectul clasei este eliminat, instanța driverului poate fi eliminată și.
Așa arată codul pentru declararea și inițializarea instanței 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; } } }
Cu cele de mai sus, instanța driverului poate fi utilizată ca parte a oricărei implementări Step care face parte din execuția scenariului.
Să vedem acum implementarea pasului pentru fiecare scenariu individual.
# 1) Aranjați pașii:
Given I have navigated to youtube website And I have entered India as search keyword
Ambii pași implică interacțiunea cu instanța driverului. Primul pas deschide fereastra browserului și navighează la site-ul YouTube
Al doilea pas caută butonul de introducere a căutării și introduce „India” ca cuvânt cheie de căutare.
Mai jos este implementarea pentru ambii pași:
((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); }
Pentru primul pas, observați afirmația că asigură că navigarea către youtube a avut succes verificând titlul ferestrei.
Notă: Pot exista diferite moduri de plasare a afirmațiilor pe diferite elemente web sau proprietăți ale driverului, dar scopul final al acestui tutorial este doar să ilustreze cu cel mai simplu mod.
În al doilea pas, am adăugat o așteptare dinamică folosind Condiții așteptate ceea ce va asigura că caseta de căutare este vizibilă înainte ca codul să încerce să introducă cuvântul cheie de căutare.
De asemenea, stocăm searchString într-un căutare câmp privat Cuvânt cheie. Aceasta se face astfel încât searchKeyword să poată fi folosit și în alte implementări Step.
Sfat - Transmiterea datelor de-a lungul pașilor
Trecerea / stocarea datelor prin această abordare (adică prin variabilele de clasă) este unul dintre mijloacele prin care datele pot fi partajate între legările pasului.
Există și alte modalități de a face acest lucru, precum Specflow în sine oferă un obiect de dicționar dinamic numit ScenarioContext. Vom vedea mai multe detalii despre acest lucru în articolele viitoare.
# 2) Pasul actului
When I press the search button
Acum, să analizăm acțiunea reală, care face clic pe butonul Căutare. Fișierul de implementare a pasului va căuta butonul de căutare și îl va face clic pentru a executa pasul scenariului.
Codul pentru acest pas arată așa cum se arată mai jos:
(When(@'I press the search button')) public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); }
# 3) În cele din urmă Pasul de afirmare:
Then I should navigate to search results page
În acest pas, verificăm doar din proprietățile driverului dacă adresa URL și titlul paginii conțin sau nu cuvântul cheie de căutare.
Codul pentru acest pas este prezentat mai jos:
(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)); }
Execuţie
Acum, să încercăm să executăm scenariul și să vedem rezultatele. Odată ce scenariul este executat, toți pașii scenariului vor fi executați secvențial. Testul va fi deschiderea unui browser, navigarea către un site web și apoi efectuarea unor acțiuni.
Rezultatul testului poate fi văzut făcând clic pe butonul „Ieșire” din rezumatul testului, care arată succesul / eșecul fiecărui pas individual.
sfaturi
Pași intermediari de eșec
În cazul în care un scenariu are pași intermediari care nu reușesc, vă rugăm să rețineți că în aceste scenarii Specflow nu va executa pur și simplu niciunul dintre pașii rămași din acel scenariu și va marca rezultatul testului ca eșuat.
mysql vs sql server vs oracle
Rularea testelor cu adaptorul NUnit
Pentru acest exemplu, ne-am executat testele folosind specflow.NUnit test runner (pe care l-am instalat prin Nuget Package Manager).
Acest lucru este diferit în câteva moduri, așa cum se arată mai jos de alergătorul Specrun pe care l-am folosit în articolul anterior.
- Runnerul Specflow.NUnit este open source.
- Nu introduce nicio întârziere în timpul executării testelor.
Concluzie
În acest articol, am văzut un exemplu extrem de integrat de integrare a seleniului cu cadrul Specflow printr-un scenariu simplu de testare a unei căutări video pe aplicația Youtube.
În timp ce integram Selenium, am trecut și prin modul în care să partajăm date între diferite legături prin câmpuri de clasă privată. De asemenea, am acoperit desfășurarea testului pe alergătorul NUnit împotriva alergătorului Specrun și am comparat ambele în detaliu.
Fișiere de cod
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; } } } }
Urmăriți următorul nostru tutorial pentru a afla mai multe despre legături comune, cu cârlige și reutilizare în pași în Specflow!
PREV Tutorial | NEXT Tutorial
Lectură recomandată
- Tutorial Castravete Seleniu: Integrare Castravete Java Seleniu WebDriver
- Introducere în Selenium WebDriver - Tutorial Selenium # 8
- Integrarea Jenkins cu Selenium WebDriver: Tutorial pas cu pas
- Implementarea primului nostru script WebDriver - Selenium WebDriver Tutorial # 10
- Cum să gestionați alertele / ferestrele pop-up în Selenium WebDriver - Selenium Tutorial # 16
- WebDriver Întreg instalare și instalare cu Eclipse - Selenium Tutorial # 9
- Verificați vizibilitatea elementelor web folosind diferite tipuri de comenzi WebDriver - Tutorial Selenium # 14
- Tutorial GeckoDriver Selenium: Cum se folosește GeckoDriver în proiecte Selenium