specflow selenium webdriver end end example
End to End Παράδειγμα χρήσης Specflow & Selenium Webdriver:
Σε αυτό Δωρεάν σειρά κατάρτισης Specflow , προς το Σύντομη εισαγωγή στο Specflow δόθηκε στο προηγούμενο σεμινάριό μας.
Σε αυτό το άρθρο, θα δούμε ένα άκρο σε άκρο παράδειγμα χρήσης προδιαγραφών BDD με βάση το Specflow και οι δοκιμές θα εκτελεστούν μέσω Selenium Webdriver.
Οι δοκιμές θα μπορούσαν να είναι τόσο απλές όσο η δοκιμή της λειτουργικότητας σύνδεσης μιας εφαρμογής. Απλώς, θα περιγράψουμε αυτές τις δοκιμές χρησιμοποιώντας το Specflow και οι υλοποιήσεις του Step θα χρησιμοποιούν το πρόγραμμα οδήγησης Selenium και τις εντολές και το NUnit ως πλαίσιο επιβεβαίωσης.
Θα χρησιμοποιήσουμε επίσης το NUnit βασισμένο στο Specflow runner (σε αντίθεση με το Specrun που δεν είναι ανοιχτού κώδικα και εισάγει μια τυχαία καθυστέρηση στην δωρεάν έκδοση).
Τι θα μάθετε:
Εκπαιδευτικό βίντεο: Specflow και Selenium
Παρακολουθήστε το σεμινάριο βίντεο για το Specflow και το Selenium:
εταιρείες που σας πληρώνουν για να δοκιμάσουν τα προϊόντα τους
Ας αρχίσουμε.
Για να ξεκινήσετε, ας δημιουργήσουμε ένα Project test Project στο Visual Studio και εγκαταστήστε τις ακόλουθες προϋποθέσεις:
# 1) Δημιουργήστε ένα έργο δοκιμής μονάδας
Εγκαταστήστε το πακέτο Nuget για Nunit και Specflow.
Install-Package Specflow.NUnit
# 2) Εγκαταστήστε το Webdriver του Selenium για πρόγραμμα περιήγησης chrome.
Αυτό μπορεί να εγκατασταθεί μέσω της κονσόλας Nuget Package Manager μέσω της παρακάτω εντολής.
Install-Package Selenium.WebDriver.ChromeDriver
# 3) Εγκαταστήστε βιβλιοθήκες Selenium Webdriver και Selenium Wait Helpers για την προσθήκη αναμενόμενων αναμονών.
Install-Package Selenium.WebDriver Install-Package DotNetSeleniumExtras.WaitHelpers
# 4) Τώρα αφαιρέστε το αρχείο test.cs από το έργο που δημιουργήθηκε αυτόματα.
Κάνουμε αυτό το βήμα για να αποφύγουμε οποιαδήποτε σύγχυση καθώς θα χρησιμοποιούμε αρχεία χαρακτηριστικών και αρχεία ορισμού βημάτων για το Specflow.
# 5) Δημιουργήστε φακέλους για χαρακτηριστικά και ορισμούς βημάτων για την αποθήκευση αρχείων υλοποίησης χαρακτηριστικών και βημάτων.
Αυτό δεν είναι υποχρεωτικό βήμα, αλλά είναι χρήσιμο να οργανώσετε τις δυνατότητες και τις υλοποιήσεις βημάτων σε ξεχωριστούς φακέλους.
# 6) Στο τέλος των παραπάνω βημάτων, η δομή λύσεων και τα πακέτα.config θα πρέπει να φαίνονται όπως φαίνεται παρακάτω.
Εφαρμογή χαρακτηριστικών και βημάτων
Ας ξεκινήσουμε τώρα με το αρχείο δυνατοτήτων και την πραγματική εφαρμογή του βήματος.
Σχετικά με τη δυνατότητα - Το χαρακτηριστικό γνώρισμα θα είναι δοκιμή / επικύρωση της λειτουργικότητας αναζήτησης του ιστότοπου Youtube. Θα αναζητήσουμε μια λέξη-κλειδί και θα υποστηρίξουμε ότι ο χρήστης ανακατευθύνθηκε στη σελίδα αποτελεσμάτων αναζήτησης.
Προσθέστε ένα νέο αρχείο χαρακτηριστικών και ονομάστε το ως 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
Το παραπάνω σενάριο αναμένει ότι η δοκιμή θα:
- Μεταβείτε στον ιστότοπο του Youtube: Αυτό θα απαιτήσει ένα πλαίσιο αυτοματοποίησης Ιστού όπως το Selenium, το οποίο θα χρησιμοποιεί ένα πρόγραμμα οδήγησης Web για να πλοηγηθεί σε μια ιστοσελίδα σε ένα πρόγραμμα περιήγησης.
- Αναζήτηση λέξης-κλειδιού: Αυτό το βήμα θα περιλαμβάνει την αναζήτηση κατάλληλων στοιχείων εισαγωγής και κουμπιών για να εισαγάγετε τη λέξη-κλειδί και να εκτελέσετε την αναζήτηση αντίστοιχα.
- Βεβαιωθείτε ότι τα αποτελέσματα αναζήτησης εμφανίζονται και ο χρήστης βρίσκεται στη σελίδα αποτελεσμάτων: Αυτό το βήμα θα περιλαμβάνει ισχυρισμούς σχετικά με την επαλήθευση εάν ο χρήστης προσγειώθηκε στη σωστή σελίδα.
Τώρα ας δούμε τις υλοποιήσεις Βήμα κάθε ένα από τα βήματα.
Πριν από αυτό, ας καταλάβουμε πώς θα ενσωματώσουμε τη λογική / κωδικό Selenium στον υπάρχοντα ορισμό της Specflow.
Σελήνιο ή οποιοδήποτε άλλο εργαλείο (ή Μονάδες δοκιμών stubs / mocks / drivers κ.λπ.) είναι ουσιαστικά ένα ενδιάμεσο μέρος της Εκτέλεσης Βημάτων, αλλά το βασικό πράγμα που πρέπει να καταλάβετε είναι ο τρόπος ενσωμάτωσης και των δύο αυτών Πλαισίων.
Το Specflow επιτρέπει στους χρήστες να γράφουν προδιαγραφές δοκιμής. Δεν υπαγορεύει το εργαλείο που πρέπει να χρησιμοποιηθεί. Ως εκ τούτου, ο προγραμματιστής δοκιμών είναι ελεύθερος να επιλέξει όσα εργαλεία δοκιμών θέλει να εξαρτάται από την περίπτωση χρήσης που επιλύεται.
Για να χρησιμοποιήσουμε το Σελήνιο σε αυτό το σενάριο, χρειαζόμαστε τα ακόλουθα:
- Μια παρουσία του WebDriver (θα χρησιμοποιούμε το ChromeDriver για απλότητα), η οποία θα επιτρέπει στον χρήστη να πλοηγείται στην ιστοσελίδα χρησιμοποιώντας ένα πρόγραμμα περιήγησης σύμφωνα με την εφαρμογή του προγράμματος οδήγησης.
- Λίγες δηλώσεις WebElement (και μπορούν να γίνουν μόνο ως μέρος των υλοποιήσεων Βήματος) που απαιτούνται για την αλληλεπίδραση με τον χρήστη και τη διαβίβαση εισόδων και την εκτέλεση ενεργειών κ.λπ.
- Λίγοι ισχυρισμοί σχετικά με τον τίτλο του παραθύρου, τις διευθύνσεις URL κ.λπ. που μπορούν να εκτελεστούν στην παρουσία του προγράμματος οδήγησης.
Θα δημιουργήσουμε μια παρουσία του ChromeWebdriver στο αρχείο Step Implementations.
Επομένως, ας δημιουργήσουμε το αρχείο Step Definition. Όπως είδαμε στο τελευταίο άρθρο, το Specflow παρέχει έναν μηχανισμό αυτόματης δημιουργίας των ορισμών βημάτων (οι οποίοι αργότερα μπορούν να προσαρμοστούν / τροποποιηθούν όπως απαιτείται).
- Μεταβείτε στο αρχείο χαρακτηριστικών, κάντε δεξί κλικ και επιλέξτε 'Δημιουργία ορισμών βημάτων'.
- Δημιουργήστε ένα νέο αρχείο στο φάκελο StepDefinitions όπως δημιουργήσαμε νωρίτερα και ονομάστε το αρχείο ως YoutubeSearchFeatureSteps.cs
- Βεβαιωθείτε ότι όλα τα βήματα του σεναρίου έχουν δεσμευτεί κατάλληλα στους ορισμούς των βημάτων.
Συμβουλή - Τροποποίηση ορισμών βημάτων που δημιουργούνται αυτόματα:
Τώρα, αν παρατηρήσετε προσεκτικά, ο ορισμός Βήματος που δημιουργήθηκε για το βήμα λέξεων-κλειδιών αναζήτησης, δηλ. 'Έχω εισαγάγει την Ινδία ως λέξη-κλειδί αναζήτησης' τον κώδικα που δημιουργείται αυτόματα, δεν προσδιορίζει / διαχωρίζει τη λέξη-κλειδί αναζήτησης και ως εκ τούτου δεν την παραμετροποιεί.
(Given(@&'I have entered India as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword() { ScenarioContext.Current.Pending(); }
Αλλά αυτό δεν θέλουμε. Χρειαζόμαστε την παραμετροποίηση της λέξης-κλειδιού αναζήτησης, διαφορετικά, για κάθε αναζήτηση λέξεων-κλειδιών, θα πρέπει να δημιουργήσουμε έναν προσαρμοσμένο ορισμό Βήματος.
Ας δούμε λοιπόν, πώς να τροποποιήσετε αυτόν τον ορισμό Βημάτων σε πιο γενικό, ο οποίος θα επιτρέψει την παραμετροποίηση της λέξης-κλειδιού αναζήτησης. Αυτό μπορεί να γίνει μέσω απλού regex matcher.
Ανατρέξτε στο παρακάτω δείγμα κώδικα. Αντικαταστήσαμε τη λέξη-κλειδί αναζήτησης μέσω ενός regex matcher, δηλ. ' (. *) 'Αυτό που θα κάνει είναι ότι θα αντικαταστήσει την τιμή οποιασδήποτε λέξης-κλειδιού που θα περάσετε από το Σενάριο και θα ορίσετε την τιμή της λέξης-κλειδιού αναζήτησης στην παράμετρο εισαγωγής με την ονομασία' searchString 'στο παρακάτω δείγμα κώδικα.
(Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { ScenarioContext.Current.Pending() }
Με αυτόν τον τρόπο, διατηρεί τον κώδικα αρθρωτό και αποφεύγει τον επαναλαμβανόμενο κωδικό boilerplate για κάθε υλοποίηση του Βήματος.
Λογική ολοκλήρωσης σεληνίου και ορισμού βημάτων
Τώρα ας δούμε την πραγματική ενσωμάτωση του Selenium με το Specflow. Μόλις δημιουργηθούν οι ορισμοί βημάτων, θα τους προσθέσουμε τώρα κώδικα για να εκτελέσουμε το πραγματικό σενάριο δοκιμής.
Ας δούμε, πού μπορούμε να τοποθετήσουμε και να αρχικοποιήσουμε την παρουσία προγράμματος οδήγησης Selenium Web, ώστε να είναι διαθέσιμη καθ 'όλη την εκτέλεση του σεναρίου. Θα τοποθετήσουμε το πρόγραμμα οδήγησης ως ιδιωτικό πεδίο της Binding Class που δημιουργήθηκε. Το πρόγραμμα οδήγησης θα αρχικοποιηθεί ως μέρος της κατηγορίας Κατασκευαστής.
Με αυτόν τον τρόπο, το πρόγραμμα οδήγησης παραμένει αρχικοποιημένο για όλη τη διάρκεια της δοκιμής, καθώς έχουμε μόνο ένα αρχείο δέσμευσης για όλα τα βήματα (και αρχικοποιείται πριν ξεκινήσει η εκτέλεση της δοκιμής).
Σημειώστε επίσης ότι θα εφαρμόσουμε επίσης το Ιδανικό διεπαφή, για να απορρίψετε την παρουσία του προγράμματος οδήγησης μετά την οποία δεν απαιτείται πλέον. Η τοποθέτησή του στη μέθοδο Dispose () θα εγγυηθεί ότι όταν το αντικείμενο της κλάσης απορριφθεί, η παρουσία προγράμματος οδήγησης μπορεί επίσης να απορριφθεί.
Έτσι φαίνεται ο κώδικας για δήλωση και αρχικοποίηση της παρουσίας 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; } } }
Με τα παραπάνω, η παρουσία προγράμματος οδήγησης μπορεί να χρησιμοποιηθεί ως μέρος οποιασδήποτε εφαρμογής Βήματος που αποτελεί μέρος της εκτέλεσης σεναρίου.
Ας δούμε τώρα το Βήμα Εφαρμογή κάθε μεμονωμένου σεναρίου.
# 1) Τακτοποιήστε τα βήματα:
Given I have navigated to youtube website And I have entered India as search keyword
Και τα δύο αυτά βήματα περιλαμβάνουν την αλληλεπίδραση με την παρουσία προγράμματος οδήγησης. Το πρώτο βήμα ανοίγει είναι το παράθυρο του προγράμματος περιήγησης και μεταβαίνει στον ιστότοπο του youtube
Το δεύτερο βήμα αναζητά το κουμπί εισαγωγής αναζήτησης και εισάγει το 'Ινδία' ως τη λέξη-κλειδί αναζήτησης.
Ακολουθεί η εφαρμογή και για τα δύο αυτά βήματα:
((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); }
Για το πρώτο βήμα, παρατηρήστε τον ισχυρισμό ότι διασφαλίζει ότι η πλοήγηση στο youtube ήταν επιτυχής ελέγχοντας τον τίτλο του παραθύρου.
Σημείωση: Μπορεί να υπάρχουν διάφοροι τρόποι τοποθέτησης ισχυρισμών σε διαφορετικά στοιχεία ιστού ή ιδιότητες προγράμματος οδήγησης, αλλά ο τελικός στόχος αυτού του σεμιναρίου είναι απλώς να απεικονιστεί με τον πιο απλοϊκό τρόπο.
Στο δεύτερο βήμα, προσθέσαμε μια δυναμική αναμονή χρησιμοποιώντας Αναμενόμενες συνθήκες το οποίο θα διασφαλίσει ότι το πλαίσιο αναζήτησης είναι ορατό πριν ο κώδικας προσπαθήσει να εισαγάγει τη λέξη-κλειδί αναζήτησης.
Επίσης, αποθηκεύουμε το SearchString σε ένα αναζήτηση ιδιωτικού πεδίου Αυτό γίνεται έτσι ώστε το searchKeyword να μπορεί να χρησιμοποιηθεί και σε άλλες εφαρμογές του Step.
Συμβουλή - Διαβίβαση δεδομένων στα Βήματα
Η μετάδοση / αποθήκευση δεδομένων με αυτήν την προσέγγιση (δηλαδή μέσω μεταβλητών κλάσης) είναι ένας από τους τρόπους με τους οποίους τα δεδομένα μπορούν να μοιραστούν μεταξύ των δεσμεύσεων Βήματος.
Υπάρχουν και άλλοι τρόποι για να το κάνετε αυτό, καθώς το Specflow παρέχει ένα αντικείμενο δυναμικού λεξικού που ονομάζεται ScenarioContext. Θα δούμε περισσότερες λεπτομέρειες σχετικά με αυτό στα επερχόμενα άρθρα.
# 2) Βήμα δράσης
When I press the search button
Τώρα ας δούμε την πραγματική ενέργεια, η οποία κάνει κλικ στο κουμπί Αναζήτηση. Το αρχείο υλοποίησης βημάτων θα αναζητήσει το κουμπί αναζήτησης και θα το κάνει κλικ για να εκτελέσει το βήμα του σεναρίου.
Ο κώδικας για αυτό το βήμα φαίνεται όπως φαίνεται παρακάτω:
(When(@'I press the search button')) public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); }
# 3) Τέλος το βήμα Assert:
Then I should navigate to search results page
Σε αυτό το βήμα, επαληθεύουμε απλώς από τις ιδιότητες προγράμματος οδήγησης σχετικά με το εάν η διεύθυνση URL και ο τίτλος της σελίδας περιέχουν τη λέξη-κλειδί αναζήτησης ή όχι.
Ο κωδικός για αυτό το βήμα εμφανίζεται παρακάτω:
(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)); }
Εκτέλεση
Τώρα, ας προσπαθήσουμε να εκτελέσουμε το σενάριο και να δούμε τα αποτελέσματα. Μόλις εκτελεστεί το Σενάριο, όλα τα Βήματα Σενάριο θα εκτελεστούν Διαδοχικά. Το τεστ θα ανοίξει ένα πρόγραμμα περιήγησης, θα πλοηγηθεί σε έναν ιστότοπο και θα εκτελέσει κάποια ενέργεια.
Η έξοδος του τεστ μπορεί να δει κανείς κάνοντας κλικ στο κουμπί 'Έξοδος' από τη σύνοψη δοκιμής που δείχνει την επιτυχία / αποτυχία κάθε μεμονωμένου βήματος.
Συμβουλές
Βήματα ενδιάμεσης αποτυχίας
Σε περίπτωση που ένα Σενάριο έχει ενδιάμεσα βήματα που αποτύχουν, λάβετε υπόψη ότι σε αυτά τα σενάρια το Specflow απλά δεν θα εκτελέσει τα υπόλοιπα Βήματα αυτού του σεναρίου και θα επισημάνει το αποτέλεσμα του τεστ ως αποτυχημένο.
καλύτερο καθαριστικό μητρώου για τα Windows 7
Εκτέλεση δοκιμών με προσαρμογέα NUnit
Για αυτό το Παράδειγμα, έχουμε εκτελέσει τις δοκιμές μας χρησιμοποιώντας τον δοκιμαστικό δείκτη Specflow.NUnit (που είχαμε εγκαταστήσει μέσω του Nuget Package Manager).
Αυτό είναι διαφορετικό με μερικούς τρόπους, όπως φαίνεται παρακάτω από τον δρομέα Specrun που είχαμε χρησιμοποιήσει στο προηγούμενο άρθρο.
- Ο δρομέας Specflow.NUnit είναι ανοιχτού κώδικα.
- Δεν καθυστερεί κατά την εκτέλεση των δοκιμών.
συμπέρασμα
Σε αυτό το άρθρο, είδαμε ένα ολοκληρωμένο παράδειγμα ολοκλήρωσης Selenium με το πλαίσιο Specflow μέσω ενός απλού δοκιμαστικού σεναρίου μιας αναζήτησης βίντεο στην εφαρμογή Youtube.
Ενώ ενσωματώσαμε το Selenium, περάσαμε επίσης, πώς να μοιραζόμαστε δεδομένα σε διαφορετικές συνδέσεις μέσω πεδίων ιδιωτικής κλάσης. Καλύψαμε επίσης τη διεξαγωγή του τεστ στο NUnit runner Vs the Specrun runner και συγκρίναμε και τα δύο λεπτομερώς.
Αρχεία κώδικα
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; } } } }
Παρακολουθήστε το επερχόμενο σεμινάριό μας για να μάθετε περισσότερα σχετικά με τους Shared & Scoped Bindings, Hooks και Step Reuse στο Specflow!
Εκπαιδευτικό πρόγραμμα PREV | ΕΠΟΜΕΝΟ Φροντιστήριο
Συνιστώμενη ανάγνωση
- Cucumber Selenium Tutorial: Αγγούρι Java Selenium WebDriver Integration
- Εισαγωγή στο Selenium WebDriver - Selenium Tutorial # 8
- Ενσωμάτωση της Jenkins με το Selenium WebDriver: Εκμάθηση βήμα προς βήμα
- Υλοποίηση του πρώτου σεναρίου WebDriver - Selenium WebDriver Tutorial # 10
- Τρόπος χειρισμού ειδοποιήσεων / αναδυόμενων παραθύρων στο Selenium WebDriver - Selenium Tutorial # 16
- WebDriver Ολόκληρη εγκατάσταση και εγκατάσταση με το Eclipse - Selenium Tutorial # 9
- Ελέγξτε την ορατότητα των στοιχείων Web χρησιμοποιώντας διάφορους τύπους εντολών WebDriver - Selenium Tutorial # 14
- Tutorial GeckoDriver Selenium: Πώς να χρησιμοποιήσετε το GeckoDriver σε έργα Selenium