specflow selenium webdriver end end example
SpecflowとSeleniumWebdriverのエンドツーエンドの使用例:
これで 無料のSpecflowトレーニングシリーズ 、へ Specflowの簡単な紹介 前のチュートリアルで与えられました。
この記事では、SpecflowベースのBDD仕様を使用するエンドツーエンドの例を示し、テストはSeleniumWebdriverを介して実行されます。
テストは、アプリケーションのログイン機能をテストするのと同じくらい簡単です。 Specflowを使用してこれらのテストについて説明し、Stepの実装ではSeleniumドライバーとコマンドおよびNUnitをアサーションフレームワークとして使用します。
また、NUnitベースのSpecflowランナーを使用します(オープンソースではなく、無料バージョンでランダムな遅延が発生するSpecrunとは対照的です)。
学習内容:
ビデオチュートリアル:SpecflowとSelenium
SpecflowとSeleniumに関するビデオチュートリアルをご覧ください。
コンピュータの温度をチェックするための最良のプログラム
始めましょう。
開始するには、Visual Studioで単体テストプロジェクトを作成し、次の前提条件をインストールしましょう。
#1)単体テストプロジェクトを作成する
NunitおよびSpecflow用のNugetパッケージをインストールします。
Install-Package Specflow.NUnit
#2)Chromeブラウザ用のSeleniumのWebdriverをインストールします。
これは、以下のコマンドを使用して、Nuget PackageManagerコンソールからもインストールできます。
Install-Package Selenium.WebDriver.ChromeDriver
#3)ExpectedCondition待機を追加するためのSeleniumWebdriverライブラリとSeleniumWaitHelpersをインストールします。
Install-Package Selenium.WebDriver Install-Package DotNetSeleniumExtras.WaitHelpers
#4)自動作成されたプロジェクトからtest.csファイルを削除します。
Specflowの機能ファイルとステップ定義ファイルを使用するため、混乱を避けるためにこのステップを実行しています。
#5)機能とステップ定義の実装ファイルを保存するための機能とステップ定義のフォルダーを作成します。
これは必須のステップではありませんが、機能とステップの実装を別々のフォルダーに整理するのに役立ちます。
#6)上記の手順を完了すると、ソリューションの構造とpackages.configは次のようになります。
機能とステップの実装
それでは、機能ファイルと実際のステップの実装から始めましょう。
機能について –サンプル機能は、YoutubeWebサイトの検索機能をテスト/検証するものです。キーワードを検索し、ユーザーが検索結果ページにリダイレクトされたことを表明します。
新しい機能ファイルを追加し、名前を付けます 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ウェブサイトに移動します。 これには、Webdriverを使用してブラウザーのWebページに移動するSeleniumのようなWeb自動化フレームワークが必要になります。
- キーワードを検索します。 このステップでは、キーワードを入力して検索を実行するために、適切な入力要素とボタンを探します。
- 検索結果が表示され、ユーザーが結果ページを表示していることを確認します。 このステップには、ユーザーが正しいページにアクセスしたかどうかの確認に関するアサーションが含まれます。
次に、各ステップのステップ実装を見てみましょう。
その前に、Seleniumロジック/コードを既存のSpecflow定義に統合する方法を理解しましょう。
セレン または他のツール(またはユニットテストのスタブ/モック/ドライバーなど)は基本的にステップ実行の中間部分ですが、理解しておくべき重要なことは、これら両方のフレームワークを統合する方法です。
Specflowを使用すると、ユーザーはテスト仕様を作成できます。使用するツールを指示するものではありません。したがって、テスト開発者は、解決されるユースケースに応じて、必要な数のテストツールを自由に選択できます。
このシナリオでSeleniumを使用するには、次のものが必要です。
- WebDriverのインスタンス(簡単にするためにChromeDriverを使用します)。これにより、ユーザーは、ドライバーの実装に従って、ブラウザーを使用して実際にWebページに移動できます。
- ユーザーと対話し、入力を渡し、アクションなどを実行するために必要なWebElement宣言はほとんどありません(ステップ実装の一部としてのみ実行できます)。
- ドライバーインスタンスで実行できるウィンドウタイトル、URLなどに関するアサーションはほとんどありません。
ステップ実装ファイルにChromeWebdriverのインスタンスを作成します。
したがって、ステップ定義ファイルを作成しましょう。前回の記事で見たように、Specflowはステップ定義を自動生成するメカニズムを提供します(後で必要に応じてカスタマイズ/変更できます)。
- 機能ファイルに移動し、右クリックして「ステップ定義の生成」を選択します。
- 以前に作成したようにStepDefinitionsフォルダーに新しいファイルを作成し、ファイルにYoutubeSearchFeatureSteps.csという名前を付けます。
- シナリオのすべてのステップがステップ定義に適切にバインドされていることを確認します。
ヒント–自動生成されたステップ定義の変更:
ここで注意深く観察すると、検索キーワードステップ用に生成されたステップ定義、つまり「検索キーワードとしてインドを入力しました」という自動生成コードは、検索キーワードを識別/分離しないため、パラメーター化されません。
(Given(@&'I have entered India as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword() { ScenarioContext.Current.Pending(); }
しかし、これは私たちが望んでいることではありません。検索キーワードをパラメータ化する必要があります。そうしないと、キーワード検索ごとに、カスタムステップ定義を作成する必要があります。
それでは、このステップ定義をより一般的なものに変更する方法を見てみましょう。これにより、検索キーワードをパラメーター化できるようになります。これは、単純な正規表現マッチャーを介して実行できます。
以下のコードサンプルを参照してください。正規表現マッチャーを使用して検索キーワードを置き換えました。 (。*) これにより、シナリオから渡すキーワードの値が置き換えられ、以下のコードサンプルの「searchString」という名前の入力パラメーターに検索キーワードの値が設定されます。
(Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { ScenarioContext.Current.Pending() }
このようにして、コードをモジュール式に保ち、ステップの実装ごとにボイラープレートコードが繰り返されるのを防ぎます。
Selenium統合とステップ定義ロジック
それでは、SeleniumとSpecflowの実際の統合を見てみましょう。ステップ定義が生成されたら、実際のテストシナリオを実行するためにコードを追加します。
シナリオの実行中に使用できるように、SeleniumWebドライバーインスタンスを配置および初期化できる場所を見てみましょう。生成されたBindingClassのプライベートフィールドとしてDriverを配置します。ドライバーは、コンストラクタークラスの一部として初期化されます。
このように、すべてのステップに対して1つのバインディングファイルしかないため、ドライバーはテスト期間中ずっと初期化されたままになります(そして、テストの実行が開始される前に初期化されます)。
また、実装することにも注意してください IDisposable インターフェース。ドライバーインスタンスを破棄し、その後は不要になります。 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
これらの手順は両方とも、ドライバーインスタンスとの対話を伴います。最初のステップはブラウザウィンドウを開き、YouTubeWebサイトに移動します
2番目のステップでは、検索入力ボタンを探し、検索キーワードとして「インド」と入力します。
以下は、これらの両方のステップの実装です。
((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へのナビゲーションが成功したことを確認するアサーションに注意してください。
注意: さまざまなWeb要素またはドライバープロパティにアサーションを配置する方法はさまざまですが、このチュートリアルの最終目標は、最も単純な方法で説明することです。
2番目のステップでは、を使用して動的待機を追加しました ExpectedConditions これにより、コードが検索キーワードを入力しようとする前に、検索ボックスが表示されます。
また、searchStringをに格納しています プライベートフィールドsearchKeyword。 これは、searchKeywordを他のステップ実装でも使用できるようにするために行われます。
ヒント–ステップ間でデータを渡す
このアプローチ(つまり、クラス変数を介した)によるデータの受け渡し/保存は、ステップバインディング間でデータを共有できる手段の1つです。
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)最後にアサートステップ:
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)); }
実行
それでは、シナリオを実行して結果を見てみましょう。シナリオが実行されると、すべてのシナリオステップが順次実行されます。テストでは、ブラウザを開き、Webサイトに移動してから、何らかのアクションを実行します。
テストの出力は、個々のステップの成功/失敗を示すテストの概要から「出力」ボタンをクリックすると表示されます。
チップ
中間の失敗したステップ
中間ステップが失敗するシナリオの場合、それらのシナリオでは、Specflowはそのシナリオの残りのステップを実行せず、テストの結果を失敗としてマークすることに注意してください。
C ++で正規表現を使用する
NUnitアダプターを使用したテストの実行
この例では、Specflow.NUnitテストランナー(Nuget Package Managerを介してインストールしたもの)を使用してテストを実行しました。
これは、以下に示すように、以前の記事で使用したSpecrunランナーとはいくつかの点で異なります。
- Specflow.NUnitランナーはオープンソースです。
- テストの実行中に遅延が発生することはありません。
結論
この記事では、Youtubeアプリケーションでのビデオ検索の簡単なテストシナリオを通じて、SeleniumをSpecflowフレームワークと統合するエンドツーエンドの例を見ました。
Seleniumを統合する際に、プライベートクラスフィールドを介してさまざまなバインディング間でデータを共有する方法についても説明しました。また、NUnitランナーとSpecrunランナーでのテストの実行についても説明し、両方を詳細に比較しました。
コードファイル
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; } } } }
Specflowでの共有およびスコープ付きバインディング、フック、およびステップの再利用について詳しくは、今後のチュートリアルをご覧ください。
前のチュートリアル | 次のチュートリアル
推奨読書
- Cucumber Seleniumチュートリアル:Cucumber Java SeleniumWebDriverの統合
- Selenium WebDriverの概要– Seleniumチュートリアル#8
- JenkinsとSeleniumWebDriverの統合:ステップバイステップのチュートリアル
- 最初のWebDriverスクリプトの実装– Selenium WebDriverチュートリアル#10
- Selenium WebDriverでアラート/ポップアップを処理する方法-Seleniumチュートリアル#16
- Eclipseを使用したWebDriver全体のセットアップとインストール– Seleniumチュートリアル#9
- さまざまなタイプのWebDriverコマンドを使用してWeb要素の可視性を確認する– Seleniumチュートリアル#14
- GeckoDriver Seleniumチュートリアル:SeleniumプロジェクトでGeckoDriverを使用する方法