Seleniumは、プログラミング言語を使用せずにWebアプリケーションテストを簡単に作成し、複数のブラウザで自動的に実行できるようにするツールを提供します。Seleniumが提供するツールの多くは、Selenium IDEを使用してテストを簡単に作成し、それらをファイルに保存してSelenium Gridに転送することで、さまざまなブラウザでリモートで自動テストを実行できます。そして実行結果を受け取ることができます。
簡単にインストール方法と使い方、Gridの設定方法について学んでみましょう。
Selenium IDEは、Webブラウザのテストを簡単に行うためのツールです。インストールから使い方、record and playback機能を使ってテストを作成しましょう。
Selenium IDEは、ChromeとFirefoxのExtention形式で提供されています。Firefoxは Add-onsでダウンロードでき、Chromeは Chrome Web Storeでダウンロードできます。
IDEを実行すると、最初の画面で"Create a new project"を選択し、プロジェクト名を入力して生成します。
URLを入力してRecordボタンを押すと、新しいウィンドウにURLが開き、そのページで行われたすべてのアクションが記録され始めます。記録が終わったら、Stop Recording ボタンを押します。これでPlayボタンを押すと、記録したテストを同じように再現します。
記録されたコマンドを見ると、ウィンドウサイズを決め、マウスでクリックしたHTML TAGの情報を保存し、キーボードでinputタグに入力したすべてのアクションがそのまま記録されます。Playボタンを押すと、コマンドが順次実行されます。コマンド全体が成功すると、ログに上記の成功ログが残ります。詳細なコマンド情報は、Selenium リファレンスドキュメントまたは下部の Reference タブで確認できます。
このようにして、1つのプロジェクトに複数のテストを作成したり、複数のプロジェクトを作成してテストを複数回実行したりできます。すべての記録が終わったら、ファイルとして保存し、そのファイルをSelenium Gridに送信して、さまざまなブラウザでテストする方法を学びましょう。
Selenium GridはHubとNodeで構成されています。Selenium IDEで作成したファイルをHubに送信すると、HubからNodeにテストを送信して実行できます。Nodeには、テストするブラウザとそのブラウザに適したブラウザドライバがインストールされている必要があります。その後、HubはNodeにインストールされているブラウザに関する情報を管理し、ファイルを受信したときに適切なNodeに転送します。
Hubにテストを送信するには、まずnpmからselenium-side-runnerをインストールする必要があります。(npmインストールがされていない場合はインストールが必要です。)
そして、ノードとして機能するサーバーには、テストするブラウザのドライバがインストールされている必要があります。
そして、ハブとノードを実行する必要があります。SeleniumホームページからSelenium stand alone jarファイルをダウンロードし、javaとして以下のようにHubとして機能するサーバーとNodeとして機能するサーバーで次のように実行します。
Hub Server
Node Server
これで、上記でインストールしたselenium-side-runnerコマンドを使用してHubにSelenium IDEで作成したファイルを転送して、リモートでブラウザのテストを開始できます。また、-cオプションでどのブラウザで実行するかを指定できます。
実際、上記で作成したテストを実行した結果が、指定したブラウザで正常に完了したことを示しています。この方法でブラウザのテストを自動的に行うことができます。
WhaTabのfront配布は週に1回ずつ行われています。そのため、デプロイが正常に完了するたびにフロントのホワイトページのバグを確認できるselenium testを作成し、それをJenkins Jobとして設定しました。Jenkins Jobを介してフロントデプロイが行われるため、自動フォローアップTriggerでSelenium test jobを実行するように設定することもできます。
ページでターゲット選択機能を使用すると、WebページでマウスでクリックしたelementをTargetとして指定できます。そしてTargetを指定してみると実際のテストで見つからない場合があります。そんなときはSelenium IDEでCommandのTargetをクリックしてみるとxpathを利用した方法でTargetを見つけることができる方法を提示しています。
コマンドドキュメントには、wait for elementで始まるコマンドがあります。ネットワーク環境やサーバーのパフォーマンスによって、ブラウザのload 時間や要求の順序が毎回異なる可能性があるため、ページ内のelementのロード完了順序が異なる場合があります。そのため、テストするたびにブラウザに特定のelementを割り当て、そのelementが指定した時間内に希望の状態になるまで待つことができます。指定した時間内に表示されない場合は、失敗で終了します。
(pauseというコマンドで指定した時間中にテストを一時停止することもできますが、wait for elementを使用することをお勧めします。)
storeコマンドを使用して、特定の要素のtextやvalue、tiltleの値をSelenium IDEから値を保存することができます。この保存された値を使用して、ifコマンドを使用して特定のtargetの値と比較するアクションを作成できます。
上の画像のように、prj_nameという名前でtargetで指定されたelementのtextを保存し、ifコマンドで比較します。その条件が満たされた場合はマウスclickを実行し、そうでない場合はend後にパスします。ifは常にendコマンドとペアで使用する必要があります。また、else if、repeat ifを使用して複数回比較するように設定できます。
上記のように値を保存し、ifステートメントで比較してフローを制御するのではなく、verfiyで始まるコマンドを使用すると、指定したelementの値またはテストが必要なものと一致することを確認して、テスト結果が成功したかどうかを判断できます。
assert で始まるコマンドもverifyと同様に動作しますが、assertの条件が失敗した場合、以降のコマンドは実行されないのが違いです。結果として、verifyとassertが失敗した場合は両方ともfailureとして記録されますが、 assertは以降のコマンドを無視して実行を終了します。一方、verifyは以降のコマンドを実行します。確認する必要があるターゲットが、後の実行に影響を与えるクリティカルなものかどうかを把握し、適切に使用すればよいです。
やむを得ずjavascriptを使ってデータを取得する必要がある場合があります。たとえば、date pickerで実行時点の現在の日付に基づいて1週間前の日付を計算したい場合は、Dateオブジェクトを使用する必要があります。このときexecute scriptコマンドが必要です。 javascript Dateオブジェクトを使用して実行時点の日付を取得し、日付フォーマットを合わせてから、それを基準にして1週間前の日付を計算させるロジックを作成します。そしてこれをreturnさせて、storeと同じ方法で指定した名前にDateオブジェクトを利用した結果データを格納させます。
上記の画像を見ると、Targetに短いjavascriptコードが含まれており、ValueにはTargetからreturnされた結果を保存するデータの名前が書き込まれます。その後、他のコマンドから名前で呼び出して使用するだけです。
Selenium IDEには、複数のtestをまとめることができるTest suitesユニットがあります。Suiteを作成すると、必要なテストをここに収めることができます。Suite でテストをグループ化すると、test が順次実行され、並列に実行できるオプションを指定できます。 Test suitesに移動した後、作成したSuiteの上にマウスを置くとオプションボタンが表示されますが、SettingsをクリックするとRun in parallelオプションチェックボックスがあります。このオプションをチェックすると、並列にテストを実行できます。並行して実行すると、テストが並行して実行されるため、より迅速に実行結果が得られます。並列に実行する場合は、各テストが独立している必要があります。