specflow selenium webdriver end end example
End-to-End-Beispiel für die Verwendung von Specflow & Selenium Webdriver:
In diesem Kostenlose Specflow-Schulungsserie zu Kurze Einführung in Specflow wurde in unserem vorherigen Tutorial gegeben.
In diesem Artikel sehen wir ein End-to-End-Beispiel für die Verwendung von Specflow-basierten BDD-Spezifikationen. Die Tests werden über Selenium Webdriver ausgeführt.
Die Tests können so einfach sein wie das Testen der Anmeldefunktionalität einer Anwendung. Es ist nur so, dass wir diese Tests mit Specflow beschreiben und die Step-Implementierungen Selenium-Treiber und -Befehle sowie NUnit als Assertion-Framework verwenden.
Wir werden auch NUnit-basierten Specflow-Runner verwenden (im Gegensatz zu Specrun, das nicht Open Source ist und in der kostenlosen Version eine zufällige Verzögerung einführt).
Was du lernen wirst:
Video-Tutorial: Specflow und Selen
Sehen Sie sich das Video-Tutorial zu Specflow und Selen an:
bestes Programm zur Überwachung der Computertemperatur
Lass uns anfangen.
Erstellen Sie zunächst ein Unit-Test-Projekt in Visual Studio und installieren Sie die folgenden Voraussetzungen:
# 1) Erstellen Sie ein Unit-Test-Projekt
Installieren Sie das Nuget-Paket für Nunit und Specflow.
Install-Package Specflow.NUnit
# 2) Installieren Sie den Webdriver von Selenium für den Chrome-Browser.
Dies kann auch über die Nuget Package Manager-Konsole über den folgenden Befehl installiert werden.
Install-Package Selenium.WebDriver.ChromeDriver
# 3) Installieren Sie Selenium Webdriver-Bibliotheken und Selenium Wait Helpers, um ExpectedCondition-Wartezeiten hinzuzufügen.
Install-Package Selenium.WebDriver Install-Package DotNetSeleniumExtras.WaitHelpers
# 4) Entfernen Sie nun die Datei test.cs aus dem Projekt, das automatisch erstellt wird.
Wir führen diesen Schritt aus, um Verwirrung zu vermeiden, da wir Feature-Dateien und Schrittdefinitionsdateien für Specflow verwenden werden.
# 5) Erstellen Sie Ordner für Features und Schrittdefinitionen, um Feature- und Schrittdefinitionsimplementierungsdateien zu speichern.
Dies ist kein obligatorischer Schritt, aber nützlich, um die Funktionen und Schrittimplementierungen in separaten Ordnern zu organisieren.
# 6) Am Ende der obigen Schritte sollten die Lösungsstruktur und die packages.config wie unten gezeigt aussehen.
Funktions- und Schrittimplementierung
Beginnen wir nun mit der Feature-Datei und der eigentlichen Schrittimplementierung.
Über die Funktion - Die Beispielfunktion besteht darin, die Suchfunktion der Youtube-Website zu testen / zu validieren. Wir werden nach einem Schlüsselwort suchen und bestätigen, dass der Benutzer zur Suchergebnisseite weitergeleitet wurde.
Fügen Sie eine neue Feature-Datei hinzu und benennen Sie sie als YoutubeSearchFeature.feature
Fügen Sie ein Szenario mit Suchfunktionen und eine Funktionsbeschreibung hinzu, wie unten gezeigt:
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
Das obige Szenario erwartet, dass der Test:
- Navigiere zur Youtube-Website: Dies erfordert ein Webautomatisierungsframework wie Selenium, das einen Webdriver verwendet, um in einem Browser zu einer Webseite zu navigieren.
- Suche nach einem Schlüsselwort: In diesem Schritt wird nach geeigneten Eingabeelementen und Schaltflächen gesucht, um das Schlüsselwort einzugeben und die Suche auszuführen.
- Stellen Sie sicher, dass die Suchergebnisse angezeigt werden und sich der Benutzer auf der Ergebnisseite befindet: Dieser Schritt beinhaltet Aussagen zur Überprüfung, ob der Benutzer auf der richtigen Seite gelandet ist.
Sehen wir uns nun die Schrittimplementierungen der einzelnen Schritte an.
Lassen Sie uns vorher verstehen, wie wir Selenium-Logik / -Code in die vorhandene Specflow-Definition integrieren.
Selen oder jedes andere Tool (oder Stubs / Mocks / Treiber usw. zum Testen von Einheiten) ist im Wesentlichen ein Zwischenbestandteil der Schrittausführung, aber das Wichtigste, was zu verstehen ist, ist die Art und Weise, diese beiden Frameworks zu integrieren.
Mit Specflow können Benutzer Testspezifikationen schreiben. Es gibt nicht das Werkzeug vor, das verwendet werden soll. Daher kann der Testentwickler so viele Testwerkzeuge auswählen, wie er vom zu lösenden Anwendungsfall abhängen möchte.
Um Selen in diesem Szenario verwenden zu können, benötigen wir Folgendes:
- Eine Instanz von WebDriver (der Einfachheit halber wird ChromeDriver verwendet), mit der der Benutzer mithilfe eines Browsers gemäß der Treiberimplementierung tatsächlich zur Webseite navigieren kann.
- Nur wenige WebElement-Deklarationen (und können nur im Rahmen von Step-Implementierungen durchgeführt werden), die erforderlich sind, um mit dem Benutzer zu interagieren, Eingaben zu übergeben und Aktionen usw. auszuführen.
- Nur wenige Aussagen zu Fenstertiteln, URLs usw., die auf der Treiberinstanz ausgeführt werden können.
Wir werden eine Instanz von ChromeWebdriver in der Step Implementations-Datei erstellen.
Erstellen wir daher die Schrittdefinitionsdatei. Wie wir im letzten Artikel gesehen haben, bietet Specflow einen Mechanismus zum automatischen Generieren der Schrittdefinitionen (die später nach Bedarf angepasst / geändert werden können).
- Navigieren Sie zur Feature-Datei, klicken Sie mit der rechten Maustaste und wählen Sie 'Schrittdefinitionen generieren'.
- Erstellen Sie eine neue Datei im zuvor erstellten StepDefinitions-Ordner und benennen Sie die Datei als YoutubeSearchFeatureSteps.cs
- Stellen Sie sicher, dass alle Schritte des Szenarios ordnungsgemäß an die Schrittdefinitionen gebunden wurden.
Tipp - Ändern der automatisch generierten Schrittdefinitionen:
Wenn Sie nun genau beobachten, identifiziert / trennt die Schrittdefinition, die für unseren Suchschlüsselwortschritt generiert wurde, d. H. 'Ich habe Indien als Suchschlüsselwort eingegeben', den automatisch generierten Code, das Suchschlüsselwort nicht und trennt es daher nicht.
(Given(@&'I have entered India as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword() { ScenarioContext.Current.Pending(); }
Aber das wollen wir nicht. Das Suchschlüsselwort muss parametrisiert werden, andernfalls müssen wir für jede Schlüsselwortsuche eine benutzerdefinierte Schrittdefinition erstellen.
Lassen Sie uns sehen, wie Sie diese Schrittdefinition in eine allgemeinere ändern, um das Suchwort zu parametrisieren. Dies kann durch einen einfachen Regex-Matcher erfolgen.
Siehe das folgende Codebeispiel. Wir haben das Suchschlüsselwort durch einen Regex-Matcher ersetzt, d. H. (. *) Dies ersetzt den Wert eines Schlüsselworts, das Sie aus dem Szenario übergeben, und legt den Wert des Suchschlüsselworts im Eingabeparameter 'searchString' im folgenden Codebeispiel fest.
(Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { ScenarioContext.Current.Pending() }
Auf diese Weise bleibt der Code modular und vermeidet wiederholten Boilerplate-Code für jede Step-Implementierung.
Selenintegration und Schrittdefinitionslogik
Lassen Sie uns nun die tatsächliche Integration von Selen in Specflow sehen. Sobald die Schrittdefinitionen generiert wurden, fügen wir ihnen Code hinzu, um das eigentliche Testszenario auszuführen.
Mal sehen, wo wir die Selenium Web-Treiberinstanz platzieren und initialisieren können, damit sie während der gesamten Szenarioausführung verfügbar ist. Wir werden den Treiber als privates Feld der generierten Bindungsklasse platzieren. Der Treiber wird als Teil der Klasse Constructor initialisiert.
Auf diese Weise bleibt der Treiber für den gesamten Verlauf des Tests initialisiert, da wir nur eine Bindungsdatei für alle Schritte haben (und diese wird initialisiert, bevor die Testausführung beginnt).
Beachten Sie auch, dass wir auch das implementieren werden IDisposable Schnittstelle, um die Treiberinstanz zu entsorgen, nach der sie nicht mehr benötigt wird. Wenn Sie es in die Dispose () -Methode einfügen, wird sichergestellt, dass nach dem Entsorgen des Objekts der Klasse auch die Treiberinstanz entsorgt werden kann.
So sieht der Code für die Deklaration und Initialisierung der WebDriver-Instanz aus:
(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; } } }
Mit dem oben Gesagten kann die Treiberinstanz als Teil jeder Schrittimplementierung verwendet werden, die Teil der Szenarioausführung ist.
Sehen wir uns nun die schrittweise Implementierung jedes einzelnen Szenarios an.
# 1) Schritte arrangieren:
Given I have navigated to youtube website And I have entered India as search keyword
Beide Schritte umfassen die Interaktion mit der Treiberinstanz. Im ersten Schritt wird das Browserfenster geöffnet und zur YouTube-Website navigiert
Im zweiten Schritt wird nach der Schaltfläche für die Sucheingabe gesucht und als Suchbegriff 'Indien' eingegeben.
Nachfolgend finden Sie die Implementierung für beide Schritte:
((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); }
Beachten Sie für den ersten Schritt die Behauptung, dass die Navigation zu YouTube erfolgreich war, indem Sie den Fenstertitel überprüfen.
Hinweis: Es gibt verschiedene Möglichkeiten, Assertions auf verschiedenen Webelementen oder Treibereigenschaften zu platzieren. Das Endziel dieses Tutorials besteht jedoch nur darin, dies auf einfachste Weise zu veranschaulichen.
Im zweiten Schritt haben wir eine dynamische Wartezeit mit hinzugefügt Erwartete Bedingungen Dadurch wird sichergestellt, dass das Suchfeld sichtbar ist, bevor der Code versucht, das Suchschlüsselwort einzugeben.
Außerdem speichern wir den searchString in a privates Feld searchKeyword. Dies geschieht, damit das searchKeyword auch in anderen Step-Implementierungen verwendet werden kann.
Tipp - Übergeben von Daten über die Schritte
Das Übergeben / Speichern von Daten nach diesem Ansatz (d. H. Über Klassenvariablen) ist eines der Mittel, mit denen Daten über Schrittbindungen hinweg gemeinsam genutzt werden können.
Es gibt auch andere Möglichkeiten, dies zu tun, da Specflow selbst ein dynamisches Wörterbuchobjekt namens ScenarioContext bereitstellt. Weitere Details hierzu finden Sie in den kommenden Artikeln.
# 2) Handlungsschritt
When I press the search button
Schauen wir uns nun die eigentliche Aktion an, bei der Sie auf die Schaltfläche 'Suchen' klicken. Die Schrittimplementierungsdatei sucht nach der Suchschaltfläche und klickt darauf, um den Szenarioschritt auszuführen.
Der Code für diesen Schritt sieht wie folgt aus:
(When(@'I press the search button')) public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); }
# 3) Zum Schluss der Assert-Schritt:
Then I should navigate to search results page
In diesem Schritt überprüfen wir lediglich anhand der Treibereigenschaften, ob die URL und der Seitentitel das Suchschlüsselwort enthalten oder nicht.
Der Code für diesen Schritt ist unten dargestellt:
(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)); }
Ausführung
Versuchen wir nun, das Szenario auszuführen und die Ergebnisse anzuzeigen. Sobald das Szenario ausgeführt wurde, werden alle Szenarioschritte nacheinander ausgeführt. Der Test öffnet einen Browser, navigiert zu einer Website und führt dann eine Aktion aus.
Die Ausgabe des Tests kann durch Klicken auf die Schaltfläche „Ausgabe“ in der Testzusammenfassung angezeigt werden, die den Erfolg / Misserfolg jedes einzelnen Schritts anzeigt.
Tipps
Zwischenfehler Schritte
Beachten Sie bei einem Szenario mit fehlgeschlagenen Zwischenschritten, dass Specflow in diesen Szenarien einfach keine verbleibenden Schritte dieses Szenarios ausführt und das Testergebnis als fehlgeschlagen markiert.
So finden Sie den Netzwerkschlüssel auf dem Router
Ausführen von Tests mit NUnit Adapter
In diesem Beispiel haben wir unsere Tests mit dem Specflow.NUnit-Testläufer ausgeführt (den wir über Nuget Package Manager installiert hatten).
Dies unterscheidet sich in einigen Punkten, wie unten gezeigt, von dem Specrun-Läufer, den wir im vorherigen Artikel verwendet hatten.
- Specflow.NUnit Runner ist Open Source.
- Während der Ausführung der Tests tritt keine Verzögerung auf.
Fazit
In diesem Artikel haben wir ein umfassendes Beispiel für die Integration von Selen in das Specflow-Framework anhand eines einfachen Testszenarios einer Videosuche in der Youtube-Anwendung gesehen.
Während der Integration von Selen haben wir auch erläutert, wie Daten über verschiedene Klassen hinweg über private Klassenfelder ausgetauscht werden können. Wir haben auch die Durchführung des Tests auf dem NUnit-Läufer gegenüber dem Specrun-Läufer behandelt und beide im Detail verglichen.
Codedateien
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; } } } }
In unserem kommenden Tutorial erfahren Sie mehr über Shared & Scoped Bindings, Hooks und Step Reuse in Specflow!
PREV Tutorial | NÄCHSTES Tutorial
Literatur-Empfehlungen
- Cucumber Selenium Tutorial: Integration von Cucumber Java Selenium WebDriver
- Einführung in Selenium WebDriver - Selenium Tutorial # 8
- Integration von Jenkins in Selenium WebDriver: Schritt-für-Schritt-Anleitung
- Implementierung unseres ersten WebDriver-Skripts - Selenium WebDriver Tutorial # 10
- Umgang mit Warnungen / Popups in Selenium WebDriver - Selenium Tutorial # 16
- WebDriver Gesamte Einrichtung und Installation mit Eclipse - Selenium Tutorial # 9
- Überprüfen Sie die Sichtbarkeit von Webelementen mithilfe verschiedener Arten von WebDriver-Befehlen - Selenium Tutorial # 14
- GeckoDriver Selenium Tutorial: Verwendung von GeckoDriver in Selenium-Projekten