specflow selenium webdriver end end example
Esempio completo di utilizzo di Specflow e Selenium Webdriver:
In questo Serie di formazione Specflow gratuita , per Breve introduzione su Specflow è stato fornito nel nostro precedente tutorial.
In questo articolo, vedremo un esempio completo di utilizzo delle specifiche BDD basate su Specflow e i test verranno eseguiti tramite Selenium Webdriver.
I test potrebbero essere semplici come testare la funzionalità di accesso di un'applicazione. È solo questo, descriveremo quei test usando Specflow e le implementazioni Step useranno driver e comandi Selenium e NUnit come framework di asserzioni.
Useremo anche il runner Specflow basato su NUnit (al contrario di Specrun che non è open source e introduce un ritardo casuale nella versione gratuita).
Cosa imparerai:
Tutorial video: Specflow e selenio
Guarda il video tutorial su Specflow e Selenium:
dov'è la chiave di sicurezza della rete?
Iniziamo.
Per iniziare, creiamo un progetto di unit test in Visual Studio e installiamo i seguenti prerequisiti:
# 1) Crea un progetto di unit test
Installa il pacchetto Nuget per Nunit e Specflow.
Install-Package Specflow.NUnit
# 2) Installa il Webdriver di Selenium per il browser Chrome.
Questo può essere installato anche tramite la console di Nuget Package Manager tramite il comando seguente.
Install-Package Selenium.WebDriver.ChromeDriver
# 3) Installa le librerie Selenium Webdriver e Selenium Wait Helper per aggiungere le attese ExpectedCondition.
Install-Package Selenium.WebDriver Install-Package DotNetSeleniumExtras.WaitHelpers
# 4) Ora rimuovi il file test.cs dal progetto creato automaticamente.
Stiamo eseguendo questo passaggio per evitare qualsiasi confusione poiché utilizzeremo file di funzionalità e file di definizione del passaggio per Specflow.
# 5) Creare cartelle per le caratteristiche e le definizioni dei passaggi per archiviare i file di implementazione delle caratteristiche e delle definizioni dei passaggi.
Questo non è un passaggio obbligatorio ma è utile per organizzare le funzionalità e le implementazioni dei passaggi in cartelle separate.
# 6) Alla fine dei passaggi precedenti, la struttura della soluzione e packages.config dovrebbero apparire come mostrato di seguito.
Implementazione di funzioni e fasi
Ora iniziamo con il file di funzionalità e l'implementazione del passaggio effettivo.
Informazioni sulla funzionalità - La funzione di esempio sarà di testare / convalidare la funzionalità di ricerca del sito web di Youtube. Cercheremo una parola chiave e affermeremo che l'utente è stato reindirizzato alla pagina dei risultati di ricerca.
Aggiungi un nuovo file di funzionalità e chiamalo come YoutubeSearchFeature.feature
Aggiungi uno scenario della funzionalità di ricerca e una descrizione delle funzionalità come mostrato di seguito:
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
Lo scenario precedente prevede che il test:
- Vai al sito web di Youtube: Ciò richiederà un framework di automazione Web come Selenium, che utilizzerà un Webdriver per navigare in una pagina Web su un browser.
- Cerca una parola chiave: Questo passaggio comporterà la ricerca di elementi di input e pulsanti appropriati per digitare la parola chiave ed eseguire la ricerca rispettivamente.
- Asserisci che i risultati della ricerca siano visualizzati e che l'utente si trovi nella pagina dei risultati: Questo passaggio comporterà affermazioni sulla verifica se l'utente è arrivato sulla pagina corretta.
Vediamo ora le implementazioni di Step di ciascuno dei passaggi.
Prima di ciò, capiamo come integreremo la logica / codice Selenium nella definizione Specflow esistente.
Selenio o qualsiasi altro strumento (o unità di test stub / mock / driver, ecc.) sono essenzialmente una parte intermedia dell'esecuzione a fasi, ma la cosa fondamentale da capire è il modo per integrare entrambi questi Framework.
Specflow consente agli utenti di scrivere specifiche di test. Non determina lo strumento che dovrebbe essere utilizzato. Quindi lo sviluppatore del test è libero di scegliere tutti gli strumenti di test che desidera a seconda del caso d'uso che viene risolto.
Per utilizzare il selenio in questo scenario, abbiamo bisogno di quanto segue:
- Un'istanza di WebDriver (utilizzeremo ChromeDriver per semplicità), che consentirà all'utente di navigare effettivamente nella pagina Web utilizzando un browser come da implementazione del driver.
- Poche dichiarazioni WebElement (e possono essere eseguite solo come parte di implementazioni Step) che sono necessarie per interagire con l'utente e passare input ed eseguire azioni ecc.
- Poche asserzioni sul titolo della finestra, URL, ecc. Che possono essere eseguite sull'istanza del driver.
Creeremo un'istanza di ChromeWebdriver nel file Step Implementations.
Quindi, creiamo il file di definizione del passaggio. Come abbiamo visto nell'ultimo articolo, Specflow fornisce un meccanismo per generare automaticamente le definizioni dei passaggi (che possono essere successivamente personalizzate / modificate secondo necessità).
- Passare al file delle caratteristiche, fare clic con il tasto destro e selezionare 'Genera definizioni di fase'.
- Crea un nuovo file nella cartella StepDefinitions come abbiamo creato in precedenza e denomina il file come YoutubeSearchFeatureSteps.cs
- Assicurarsi che tutti i passaggi dello scenario siano stati associati in modo appropriato alle definizioni dei passaggi.
Suggerimento: modifica delle definizioni dei passaggi generate automaticamente:
Ora, se osservi attentamente, la definizione del passaggio che è stata generata per il nostro passaggio della parola chiave di ricerca, ovvero 'Ho inserito l'India come parola chiave di ricerca', il codice generato automaticamente, non identifica / separa la parola chiave di ricerca e quindi non la parametrizza.
(Given(@&'I have entered India as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword() { ScenarioContext.Current.Pending(); }
Ma questo non è quello che vogliamo. Abbiamo bisogno di parametrizzare la parola chiave di ricerca, altrimenti, per ogni ricerca di parola chiave, dovremo creare una definizione di Step personalizzata.
Quindi, vediamo come modificare questa definizione di passaggio in una più generica, che consentirà di parametrizzare la parola chiave di ricerca. Questo può essere fatto tramite un semplice abbinamento regex.
Fare riferimento all'esempio di codice riportato di seguito. Abbiamo sostituito la parola chiave di ricerca con un abbinamento regex, ad esempio ' (. *) 'Ciò che farà è che sostituirà il valore di qualsiasi parola chiave che passerai dallo scenario e imposterà il valore della parola chiave di ricerca nel parametro di input denominato' searchString 'nell'esempio di codice seguente.
(Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { ScenarioContext.Current.Pending() }
In questo modo, mantiene il codice modulare ed evita il codice boilerplate ripetuto per ogni implementazione Step.
Integrazione del selenio e logica di definizione del passo
Ora vediamo l'effettiva integrazione di Selenium con Specflow. Una volta generate le definizioni dei passaggi, ora aggiungeremo codice per eseguire lo scenario di test effettivo.
Vediamo dove possiamo posizionare e inizializzare l'istanza del driver Web Selenium in modo che sia disponibile durante l'esecuzione dello scenario. Metteremo il driver come campo privato della classe vincolante che è stata generata. Il driver verrà inizializzato come parte della classe Constructor.
In questo modo, il driver rimane inizializzato per tutto il corso della durata del test poiché abbiamo un solo file Binding per tutti i passaggi (e viene inizializzato prima che inizi l'esecuzione del test).
Si noti inoltre che implementeremo anche il IDisposable interfaccia, in modo da eliminare l'istanza del driver dopodiché non è più necessaria. Inserendolo nel metodo Dispose () garantirà che una volta che l'oggetto della classe viene eliminato, anche l'istanza del driver può essere eliminata.
Ecco come appare il codice per la dichiarazione e l'inizializzazione dell'istanza 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; } } }
Con quanto sopra, l'istanza del driver può essere utilizzata come parte di qualsiasi implementazione Step che fa parte dell'esecuzione dello scenario.
Vediamo ora l'implementazione graduale di ogni singolo scenario.
# 1) Organizza i passaggi:
Given I have navigated to youtube website And I have entered India as search keyword
Entrambi questi passaggi implicano l'interazione con l'istanza del driver. Il primo passaggio è aprire la finestra del browser e accedere al sito web di YouTube
Il secondo passaggio cerca il pulsante di immissione della ricerca e immette 'India' come parola chiave di ricerca.
Di seguito è riportata l'implementazione per entrambi questi passaggi:
((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 il primo passaggio, nota l'asserzione che garantisce che la navigazione su YouTube sia andata a buon fine controllando il titolo della finestra.
Nota: Ci possono essere vari modi per posizionare le asserzioni su diversi elementi web o proprietà del driver, ma l'obiettivo finale di questo tutorial è solo quello di illustrare con il modo più semplicistico.
Nella seconda fase, abbiamo aggiunto un'attesa dinamica utilizzando ExpectedConditions che assicurerà che la casella di ricerca sia visibile prima che il codice tenti di digitare la parola chiave di ricerca.
Inoltre, stiamo archiviando la stringa di ricerca in un file parola chiave di ricerca campo privato. Questo viene fatto in modo che searchKeyword possa essere utilizzato anche in altre implementazioni di Step.
Suggerimento: passaggio di dati attraverso i passaggi
Il passaggio / archiviazione dei dati con questo approccio (cioè attraverso le variabili di classe) è uno dei mezzi attraverso i quali i dati possono essere condivisi tra le associazioni Step.
Esistono altri modi per farlo, come Specflow stesso fornisce un oggetto dizionario dinamico chiamato ScenarioContext. Vedremo maggiori dettagli su questo nei prossimi articoli.
# 2) Passo atto
When I press the search button
Ora diamo un'occhiata all'azione effettiva, ovvero fare clic sul pulsante Cerca. Il file di implementazione del passaggio cercherà il pulsante di ricerca e farà clic su di esso per eseguire il passaggio dello scenario.
Il codice per questo passaggio appare come mostrato di seguito:
(When(@'I press the search button')) public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); }
# 3) Infine il passaggio di asserzione:
Then I should navigate to search results page
In questo passaggio, stiamo solo verificando dalle proprietà del driver se l'URL e il titolo della pagina contengono la parola chiave di ricerca o meno.
Il codice per questo passaggio è mostrato di seguito:
(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)); }
Esecuzione
Ora proviamo a eseguire lo scenario e vedere i risultati. Una volta eseguito lo scenario, tutti i passaggi dello scenario verranno eseguiti in sequenza. Il test aprirà un browser, visiterà un sito Web e quindi eseguirà alcune azioni.
L'output del test può essere visualizzato facendo clic sul pulsante 'Output' dal riepilogo del test che mostra il successo / fallimento di ogni singolo passaggio.
Suggerimenti
Passaggi intermedi falliti
Nel caso in cui uno scenario abbia passaggi intermedi che non sono riusciti, si prega di notare che in quegli scenari Specflow semplicemente non eseguirà alcun passaggio rimanente di quello scenario e contrassegnerà il risultato del test come non riuscito.
qual è il miglior software per copiare dvd
Esecuzione di test con NUnit Adapter
Per questo esempio, abbiamo eseguito i nostri test utilizzando il test runner Specflow.NUnit (che avevamo installato tramite Nuget Package Manager).
Questo è diverso in alcuni modi, come mostrato di seguito, dal runner Specrun che avevamo usato nell'articolo precedente.
- Specflow.NUnit runner è open source.
- Non introduce alcun ritardo durante l'esecuzione dei test.
Conclusione
In questo articolo, abbiamo visto un esempio end-to-end di integrazione del selenio con il framework Specflow attraverso un semplice scenario di test di una ricerca video sull'applicazione Youtube.
Durante l'integrazione di Selenium, abbiamo anche esaminato come condividere i dati tra associazioni diverse attraverso campi di classe privata. Abbiamo anche coperto l'esecuzione del test sul corridore NUnit contro il corridore Specrun e confrontato entrambi in dettaglio.
File di codice
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; } } } }
Guarda il nostro prossimo tutorial per saperne di più su binding condivisi e con ambito, hook e riutilizzo dei passaggi in Specflow!
Tutorial PREV | PROSSIMO Tutorial
Lettura consigliata
- Esercitazione sul selenio di cetriolo: integrazione del driver Web di selenio Java di cetriolo
- Introduzione a Selenium WebDriver - Selenium Tutorial # 8
- Integrazione di Jenkins con Selenium WebDriver: tutorial passo passo
- Implementazione del nostro primo script WebDriver - Selenium WebDriver Tutorial # 10
- Come gestire gli avvisi / popup in Selenium WebDriver - Selenium Tutorial # 16
- WebDriver intera configurazione e installazione con Eclipse - Selenium Tutorial # 9
- Controlla la visibilità degli elementi Web utilizzando vari tipi di comandi WebDriver - Selenium Tutorial # 14
- Tutorial GeckoDriver Selenium: come utilizzare GeckoDriver nei progetti Selenium