specflow selenium webdriver end end example
Exemple de bout en bout d'utilisation de Specflow et Selenium Webdriver:
Dans ce Série de formation gratuite Specflow , à Brève introduction sur Specflow a été donnée dans notre tutoriel précédent.
Dans cet article, nous verrons un exemple de bout en bout d'utilisation des spécifications BDD basées sur Specflow et les tests seront exécutés via Selenium Webdriver.
Les tests peuvent être aussi simples que de tester la fonctionnalité de connexion d'une application. C'est juste que, nous décrirons ces tests en utilisant Specflow et les implémentations Step utiliseront le pilote et les commandes Selenium et NUnit comme cadre d'assertion.
Nous utiliserons également le runner Specflow basé sur NUnit (par opposition à Specrun qui n'est pas open source et introduit un délai aléatoire dans la version gratuite).
Ce que vous apprendrez:
Tutoriel vidéo: Specflow et Selenium
Regardez le didacticiel vidéo sur Specflow et Selenium:
comment créer un fichier java dans eclipse
Commençons.
Pour commencer, créons un projet de test unitaire dans Visual Studio et installez les prérequis suivants:
# 1) Créer un projet de test unitaire
Installez le package Nuget pour Nunit et Specflow.
Install-Package Specflow.NUnit
# 2) Installez le Webdriver de Selenium pour le navigateur Chrome.
Cela peut également être installé via la console Nuget Package Manager via la commande ci-dessous.
Install-Package Selenium.WebDriver.ChromeDriver
# 3) Installez les bibliothèques Selenium Webdriver et les Helpers Selenium Wait pour l'ajout d'attentes ExpectedCondition.
Install-Package Selenium.WebDriver Install-Package DotNetSeleniumExtras.WaitHelpers
# 4) Supprimez maintenant le fichier test.cs du projet créé automatiquement.
Nous faisons cette étape pour éviter toute confusion car nous utiliserons des fichiers de fonctionnalités et des fichiers de définition d'étape pour Specflow.
# 5) Créez des dossiers pour les fonctionnalités et les définitions d'étape pour stocker les fichiers d'implémentation de définition de fonctionnalité et d'étape.
Ce n'est pas une étape obligatoire mais utile pour organiser les fonctionnalités et les implémentations d'étape dans des dossiers séparés.
# 6) À la fin des étapes ci-dessus, la structure de la solution et le packages.config doivent ressembler à ceux ci-dessous.
Implémentation des fonctionnalités et des étapes
Commençons maintenant avec le fichier d'entités et la mise en œuvre réelle de l'étape.
À propos de la fonctionnalité - La fonctionnalité d'exemple consistera à tester / valider la fonctionnalité de recherche du site Web Youtube. Nous rechercherons un mot-clé et affirmerons que l'utilisateur a été redirigé vers la page de résultats de recherche.
Ajoutez un nouveau fichier de fonctionnalités et nommez-le comme YoutubeSearchFeature.feature
Ajoutez un scénario de fonctionnalité de recherche et une description de fonctionnalité comme indiqué ci-dessous:
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
Le scénario ci-dessus s'attend à ce que le test:
- Accédez au site Web Youtube: Cela nécessitera un cadre d'automatisation Web comme Selenium, qui utilisera un Webdriver pour naviguer vers une page Web sur un navigateur.
- Recherchez un mot-clé: Cette étape impliquera de rechercher les éléments d'entrée et les boutons appropriés afin de saisir le mot-clé et d'exécuter la recherche respectivement.
- Affirmez que les résultats de la recherche sont affichés et que l'utilisateur est sur la page de résultats: Cette étape impliquera des affirmations autour de la vérification si l'utilisateur a atterri sur la bonne page.
Voyons maintenant les implémentations Step de chacune des étapes.
Avant cela, voyons comment nous allons intégrer la logique / le code Selenium dans la définition Specflow existante.
Sélénium ou tout autre outil (ou stubs / simulateurs / pilotes de tests unitaires, etc.) sont essentiellement une partie intermédiaire de l'exécution de l'étape, mais la chose clé à comprendre est la manière d'intégrer ces deux cadres.
Specflow permet aux utilisateurs d'écrire des spécifications de test. Il ne dicte pas l'outil à utiliser. Par conséquent, le développeur de test est libre de choisir autant d'outils de test qu'il le souhaite en fonction du cas d'utilisation résolu.
Pour utiliser Selenium dans ce scénario, nous avons besoin des éléments suivants:
- Une instance de WebDriver (nous utiliserons ChromeDriver pour plus de simplicité), qui permettra à l'utilisateur de naviguer réellement vers la page Web à l'aide d'un navigateur conformément à la mise en œuvre du pilote.
- Peu de déclarations WebElement (et peuvent être effectuées dans le cadre des implémentations Step uniquement) qui sont nécessaires pour interagir avec l'utilisateur et passer des entrées et effectuer des actions, etc.
- Peu d'assertions sur le titre de la fenêtre, les URL, etc. qui peuvent être exécutées sur l'instance du pilote.
Nous allons créer une instance de ChromeWebdriver dans le fichier Step Implementation.
Par conséquent, créons le fichier de définition d'étape. Comme nous l'avons vu dans le dernier article, Specflow fournit un mécanisme pour générer automatiquement les définitions d'étape (qui peuvent ensuite être personnalisées / modifiées selon les besoins).
- Accédez au fichier d'entités, cliquez avec le bouton droit de la souris et sélectionnez «Générer des définitions d'étape».
- Créez un nouveau fichier dans le dossier StepDefinitions comme nous l'avons créé précédemment et nommez le fichier YoutubeSearchFeatureSteps.cs
- Assurez-vous que toutes les étapes du scénario ont été liées de manière appropriée aux définitions d'étape.
Astuce - Modification des définitions d'étape générées automatiquement:
Maintenant, si vous observez attentivement, la définition de l'étape qui a été générée pour notre étape de mot-clé de recherche, c'est-à-dire 'J'ai entré l'Inde comme mot-clé de recherche', le code généré automatiquement, n'identifie pas / ne sépare pas le mot-clé de recherche et ne le paramètre donc pas.
(Given(@&'I have entered India as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword() { ScenarioContext.Current.Pending(); }
Mais ce n'est pas ce que nous voulons. Nous avons besoin que le mot-clé de recherche soit paramétré, sinon, pour chaque recherche de mot-clé, nous devrons créer une définition d'étape personnalisée.
Voyons donc comment modifier cette définition d'étape en une définition plus générique, ce qui permettra de paramétrer le mot-clé de recherche. Cela peut être fait par un simple matcher regex.
Reportez-vous à l'exemple de code ci-dessous. Nous avons remplacé le mot-clé de recherche par un correcteur d'expression régulière, c'est-à-dire ' (. *) 'Cela remplacera la valeur de tout mot clé que vous passerez du scénario et définira la valeur du mot clé de recherche dans le paramètre d'entrée nommé' searchString 'dans l'exemple de code ci-dessous.
(Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { ScenarioContext.Current.Pending() }
De cette façon, il maintient le code modulaire et évite la répétition du code standard pour chaque implémentation Step.
Intégration de Selenium et logique de définition des étapes
Voyons maintenant l'intégration réelle de Selenium avec Specflow. Une fois les définitions d'étape générées, nous allons maintenant leur ajouter du code afin d'exécuter le scénario de test réel.
Voyons, où nous pouvons placer et initialiser l'instance du pilote Web Selenium afin qu'elle soit disponible tout au long de l'exécution du scénario. Nous placerons le pilote en tant que champ privé de la classe de liaison qui a été générée. Le pilote sera initialisé en tant que partie de la classe Constructor.
De cette façon, le pilote reste initialisé pendant toute la durée du test car nous n'avons qu'un seul fichier de liaison pour toutes les étapes (et il est initialisé avant le début de l'exécution du test).
Notez également que nous mettrons également en œuvre le IDisposable interface, afin de supprimer l'instance de pilote après laquelle elle n'est plus nécessaire. Le placer dans la méthode Dispose () garantira qu’une fois l’objet de la classe supprimé, l’instance du pilote pourra également être supprimée.
Voici à quoi ressemble le code de déclaration et d'initialisation de l'instance 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; } } }
Avec ce qui précède, l'instance de pilote peut être utilisée dans le cadre de toute implémentation Step qui fait partie de l'exécution du scénario.
Voyons maintenant la mise en œuvre par étapes de chaque scénario individuel.
# 1) Organisez les étapes:
Given I have navigated to youtube website And I have entered India as search keyword
Ces deux étapes impliquent une interaction avec l'instance de pilote. La première étape ouvre la fenêtre du navigateur et accède au site Web YouTube
La deuxième étape recherche le bouton d'entrée de recherche et entre «Inde» comme mot-clé de recherche.
Voici la mise en œuvre de ces deux étapes:
((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); }
Pour la première étape, notez l'assertion qui garantit que la navigation vers youtube a réussi en vérifiant le titre de la fenêtre.
Noter: Il peut y avoir différentes façons de placer des assertions sur différents éléments Web ou propriétés de pilote, mais l'objectif final de ce didacticiel est simplement d'illustrer de la manière la plus simpliste.
Dans la deuxième étape, nous avons ajouté une attente dynamique en utilisant Conditions attendues qui garantira que la zone de recherche est visible avant que le code tente de saisir le mot-clé de recherche.
De plus, nous stockons le searchString dans un recherche de champ privé Ceci est fait pour que le searchKeyword puisse également être utilisé dans d'autres implémentations Step.
Astuce - Passer des données à travers les étapes
La transmission / le stockage de données par cette approche (c'est-à-dire via des variables de classe) est l'un des moyens par lesquels les données peuvent être partagées entre les liaisons Step.
Il existe également d'autres moyens de le faire, comme Specflow lui-même fournit un objet de dictionnaire dynamique appelé ScenarioContext. Nous verrons plus de détails à ce sujet dans les prochains articles.
# 2) Étape d'action
When I press the search button
Voyons maintenant l'action réelle, qui consiste à cliquer sur le bouton Rechercher. Le fichier d'implémentation d'étape recherchera le bouton de recherche et cliquera dessus pour exécuter l'étape de scénario.
Le code de cette étape ressemble à celui ci-dessous:
(When(@'I press the search button')) public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); }
# 3) Enfin, l'étape Assert:
Then I should navigate to search results page
Dans cette étape, nous vérifions simplement à partir des propriétés du pilote si l'URL et le titre de la page contiennent le mot-clé de recherche ou non.
Le code de cette étape est indiqué ci-dessous:
(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)); }
Exécution
Maintenant, essayons d'exécuter le scénario et de voir les résultats. Une fois le scénario exécuté, toutes les étapes du scénario seront exécutées séquentiellement. Le test ouvrira un navigateur, naviguera vers un site Web, puis effectuera une action.
La sortie du test peut être vue en cliquant sur le bouton «Sortie» du résumé du test qui montre le succès / échec de chaque étape individuelle.
Des astuces
Étapes d'échec intermédiaires
Dans le cas d'un scénario ayant des étapes intermédiaires qui échouent, veuillez noter que dans ces scénarios, Specflow n'exécutera tout simplement aucune étape restante de ce scénario et marquera le résultat du test comme ayant échoué.
meilleur service de conférence téléphonique gratuit 2020
Exécution de tests avec l'adaptateur NUnit
Pour cet exemple, nous avons exécuté nos tests en utilisant le lanceur de test Specflow.NUnit (que nous avions installé via Nuget Package Manager).
Ceci est différent à plusieurs égards, comme indiqué ci-dessous, du runner Specrun que nous avions utilisé dans l'article précédent.
- Specflow.NUnit runner est open source.
- Il n'introduit aucun délai lors de l'exécution des tests.
Conclusion
Dans cet article, nous avons vu un exemple de bout en bout d'intégration de Selenium avec le framework Specflow à travers un scénario de test simple d'une recherche vidéo sur l'application Youtube.
Lors de l'intégration de Selenium, nous avons également examiné comment partager des données entre différentes liaisons via des champs de classe privés. Nous avons également couvert l'exécution du test sur le coureur NUnit contre le coureur Specrun et avons comparé les deux en détail.
Fichiers de code
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; } } } }
Regardez notre prochain tutoriel pour en savoir plus sur les liaisons partagées et étendues, les crochets et la réutilisation d'étape dans Specflow!
Tutoriel PREV | Tutoriel SUIVANT
lecture recommandée
- Tutoriel Cucumber Selenium: Intégration Cucumber Java Selenium WebDriver
- Introduction à Selenium WebDriver - Tutoriel Selenium # 8
- Intégration de Jenkins avec Selenium WebDriver: tutoriel pas à pas
- Implémentation de notre premier script WebDriver - Tutoriel Selenium WebDriver # 10
- Comment gérer les alertes / fenêtres contextuelles dans Selenium WebDriver - Tutoriel Selenium # 16
- Configuration et installation complètes de WebDriver avec Eclipse - Tutoriel Selenium # 9
- Vérifier la visibilité des éléments Web à l'aide de divers types Commandes WebDriver - Tutoriel Selenium # 14
- Tutoriel GeckoDriver Selenium: Comment utiliser GeckoDriver dans les projets Selenium