HTML ランナー
コマンドラインから HTML Selenium IDE エクスポートを実行する
Selenium-IDE (統合開発環境) は、Selenium テストケースを開発するために使用するツールです。使いやすい Firefox プラグインであり、一般的にテストケースを開発する最も効率的な方法です。また、ブラウザの現在表示されているページから UI 要素を最初に選択し、選択した UI 要素のコンテキストに従ってパラメータが事前定義された Selenium コマンドのリストから選択できるコンテキストメニューも含まれています。これは時間の節約になるだけでなく、Selenium スクリプト構文を学ぶための優れた方法でもあります。
この章では、Selenium IDE とその効果的な使用方法について説明します。
Firefox を使用して、まず SeleniumHQ ダウンロードページ から IDE をダウンロードします。
Firefox は、不慣れな場所からのアドオンのインストールから保護するため、次のスクリーンショットに示すように、インストールを続行するには「許可」をクリックする必要があります。
Firefox からダウンロードすると、次のウィンドウが表示されます。
今すぐインストールを選択します。Firefox アドオンウィンドウがポップアップ表示され、最初にプログレスバーが表示され、ダウンロードが完了すると、次のように表示されます。
Firefox を再起動します。Firefox の再起動後、Selenium-IDE が Firefox のツールメニューにリストされていることがわかります。
Selenium-IDE を実行するには、Firefox のツールメニューから選択するだけです。空のスクリプト編集ウィンドウと、テストケースのロードまたは新規作成のメニューとともに、次のように開きます。
ファイルメニューには、テストケースとテストスイート (テストケースのスイート) のオプションがあります。これらを使用して、新しいテストケースの追加、テストケースを開く、テストケースを保存する、選択した言語でテストケースをエクスポートできます。最近使用したテストケースを開くこともできます。これらのオプションはすべて、テストスイートでも利用できます。
編集メニューでは、テストケースのコマンドを編集するためのコピー、貼り付け、削除、元に戻す、およびすべて選択操作が可能です。オプションメニューでは、設定の変更が可能です。特定のコマンドのタイムアウト値を設定したり、ユーザー定義のユーザー拡張機能を Selenium コマンドの基本セットに追加したり、テストケースを保存するときに使用する形式 (言語) を指定したりできます。ヘルプメニューは、標準の Firefox ヘルプメニューです。このメニューの項目で Selenium-IDE に関連するのは、UI 要素ドキュメントだけです。
ツールバーには、テストケースの実行を制御するためのボタンが含まれています。これには、テストケースをデバッグするためのステップ機能が含まれています。右端のボタン、赤い点の付いたボタンは、記録ボタンです。
速度制御: テストケースの実行速度を制御します。
すべて実行: 複数のテストケースを含むテストスイートがロードされている場合、テストスイート全体を実行します。
実行: 現在選択されているテストを実行します。単一のテストのみがロードされている場合、このボタンとすべて実行ボタンは同じ効果があります。
一時停止/再開: 実行中のテストケースの停止と再開を許可します。
ステップ: テストケースを一度に 1 つのコマンドずつ実行して「ステップ」実行できます。テストケースのデバッグに使用します。
TestRunner モード: Selenium-Core TestRunner でロードされたブラウザでテストケースを実行できます。TestRunner は現在一般的に使用されておらず、非推奨になる可能性があります。このボタンは、TestRunner との下位互換性のためにテストケースを評価するためのものです。ほとんどのユーザーはこのボタンを必要としないでしょう。
ロールアップルールの適用: この高度な機能を使用すると、反復的な Selenium コマンドのシーケンスを単一のアクションにグループ化できます。ロールアップルールの詳細なドキュメントは、ヘルプメニューの UI 要素ドキュメントにあります。
スクリプトはテストケースペインに表示されます。コマンドとそのパラメータを読みやすい「テーブル」形式で表示するための 2 つのタブがあります。
もう一方のタブ - ソースは、ファイルが保存されるネイティブ形式でテストケースを表示します。デフォルトでは HTML ですが、Java や C# などのプログラミング言語、または Python などのスクリプト言語に変更できます。詳細については、オプションメニューを参照してください。ソースビューでは、コピー、切り取り、貼り付け操作など、生の形式でテストケースを編集することもできます。
コマンド、ターゲット、および値のエントリフィールドには、現在選択されているコマンドがパラメータとともに表示されます。これらは、現在選択されているコマンドを変更できるエントリフィールドです。下部ペインの [リファレンス] タブでコマンドに指定された最初のパラメータは、常に [ターゲット] フィールドに入ります。[リファレンス] タブで 2 番目のパラメータが指定されている場合、常に [値] フィールドに入ります。
[コマンド] フィールドに入力を開始すると、入力した最初の文字に基づいてドロップダウンリストが入力されます。ドロップダウンから目的のコマンドを選択できます。
下部ペインは、選択されているタブに応じて、ログ、リファレンス、UI 要素、ロールアップの 4 つの異なる機能に使用されます。
テストケースを実行すると、ログタブを最初に選択しなくても、エラーメッセージと進行状況を示す情報メッセージがこのペインに自動的に表示されます。これらのメッセージは、テストケースのデバッグに役立つことがよくあります。ログをクリアするための [クリア] ボタンに注意してください。また、[情報] ボタンは、ログに記録する情報のさまざまなレベルを選択できるドロップダウンであることに注意してください。
[リファレンス] タブは、テーブルモードで Selenese コマンドとパラメータを入力または変更するときは常にデフォルトで選択されます。テーブルモードでは、[リファレンス] ペインに現在のコマンドに関するドキュメントが表示されます。テーブルモードまたはソースモードからコマンドを入力または変更するときは、[ターゲット] および [値] フィールドで指定されたパラメータが、[リファレンス] ペインのパラメータリストで指定されたパラメータと一致していることを確認することが非常に重要です。指定されたパラメータの数は、指定された数と一致する必要があり、指定されたパラメータの順序は、指定された順序と一致する必要があり、指定されたパラメータのタイプは、指定されたタイプと一致する必要があります。これら 3 つの領域のいずれかに不一致がある場合、コマンドは正しく実行されません。
[リファレンス] タブはクイックリファレンスとして非常に貴重ですが、Selenium リファレンスドキュメントを参照する必要がある場合もよくあります。
これらの 2 つのペイン (高度な機能をカバーしています) に関する詳細情報は、Selenium-IDE のヘルプメニューにある UI 要素ドキュメントにあります。
テストケースを開発するには、主に 3 つの方法があります。多くの場合、テスト開発者は 3 つのテクニックすべてを必要とします。
多くの初めてのユーザーは、Web サイトとのインタラクションからテストケースを記録することから始めます。Selenium-IDE を最初に開くと、記録ボタンはデフォルトで ON になっています。Selenium-IDE が自動的に記録を開始しないようにする場合は、[オプション] > [オプション...] に移動し、[開いたらすぐに記録を開始] をオフにします。
記録中、Selenium-IDE はアクションに基づいてコマンドをテストケースに自動的に挿入します。通常、これには以下が含まれます。
注意すべき「落とし穴」をいくつか示します。
テストケースでは、Web ページのプロパティも確認する必要があります。これには、assert コマンドと verify コマンドが必要です。これらのコマンドの詳細はここでは説明しません。それは Selenium コマンド – “Selenese” の章にあります。ここでは、テストケースにそれらを追加する方法について簡単に説明します。
Selenium-IDE の記録中に、テストアプリケーションを表示しているブラウザに移動し、ページ上の任意の場所を右クリックします。verify コマンドまたは assert コマンド (あるいは両方) を示すコンテキストメニューが表示されます。
Selenium を初めて使用する場合は、Selenium コマンドが 1 つだけリストされている場合があります。ただし、IDE を使用すると、追加のコマンドがすぐにこのメニューに追加されることがわかります。Selenium-IDE は、現在の Web ページ上の選択された UI 要素に必要なコマンドとパラメータを予測しようとします。
これがどのように機能するかを見てみましょう。任意の Web ページを開き、ページ上のテキストブロックを選択します。段落または見出しで問題ありません。次に、選択したテキストを右クリックします。コンテキストメニューには、verifyTextPresent コマンドが表示され、推奨されるパラメータはテキスト自体である必要があります。
また、[利用可能なすべてのコマンドを表示] メニューオプションにも注目してください。これにより、現在選択している UI 要素をテストするための、推奨されるパラメータとともに、さらに多くのコマンドが表示されます。
さらにいくつかの UI 要素を試してください。画像、またはボタンやチェックボックスなどのユーザーコントロールを右クリックしてみてください。[利用可能なすべてのコマンドを表示] を使用して、verifyTextPresent 以外のオプションを表示する必要がある場合があります。これらの他のオプションを選択すると、より一般的に使用されるオプションが、次に画像を選択して右クリックしたときに、プライマリコンテキストメニューに表示されるようになります。たとえば、画像の verifyElementPresent を選択すると、次回画像を選択して右クリックしたときに、そのコマンドがプライマリコンテキストメニューで使用できるようになるはずです。
繰り返しますが、これらのコマンドは Selenium コマンドの章で詳しく説明します。ただし今のところは、IDE を自由に使用して、テストケースにコマンドを記録および選択してから実行してください。IDE を試してみるだけで、Selenium コマンドについて多くを学ぶことができます。
コマンドを挿入するテストケース内のポイントを選択します。これを行うには、テストケースペインで、新しいコマンドを挿入する行を左クリックします。右クリックして [コマンドの挿入] を選択します。IDE は、選択した行のすぐ前に行を追加します。次に、コマンド編集テキストフィールドを使用して、新しいコマンドとそのパラメータを入力します。
コマンドを挿入するテストケース内のポイントを選択します。これを行うには、テストケースペインで、新しいコマンドを挿入するコマンドの間を左クリックし、コマンド、最初のパラメータ (コマンドで必要な場合)、2 番目のパラメータ (要素を特定するために必要な場合)、および 3 番目のパラメータ (値を指定するために必要な場合) を含む 3 列の行を作成するために必要な HTML タグを入力します。例
<tr>
<td>Command</td>
<td>target (locator)</td>
<td>Value</td>
</tr>
コメントを追加して、テストケースを読みやすくすることができます。これらのコメントは、テストケースの実行時には無視されます。
コメントは、テストに垂直方向の空白 (1 つ以上の空白行) を追加するためにも使用できます。空のコメントを作成するだけです。空のコマンドは実行中にエラーを引き起こしますが、空のコメントは引き起こしません。
コメントを挿入するテストケース内の行を選択します。右クリックして [コメントの挿入] を選択します。次に、[コマンド] フィールドを使用してコメントを入力します。コメントは紫色のテキストで表示されます。
コメントを挿入するテストケース内のポイントを選択します。HTML スタイルのコメント (例: <!-- ここにコメント -->
) を追加します。
変更する行を選択し、[コマンド]、[ターゲット]、および [値] フィールドを使用して編集するだけです。
ソースビューは WYSIWYG (見たままが得られる) エディタと同等の機能を提供するため、変更する行 (コマンド、パラメータ、またはコメント) を変更するだけです。
ほとんどのプログラムと同様に、[ファイル] メニューの下に [保存] および [開く] コマンドがあります。ただし、Selenium はテストケースとテストスイートを区別します。Selenium-IDE テストを後で使用するために保存するには、個々のテストケースを保存するか、テストスイートを保存できます。テストスイートのテストケースが保存されていない場合は、テストスイートを保存する前に保存するように求められます。
既存のテストケースまたはスイートを開くと、Selenium-IDE はその Selenium コマンドをテストケースペインに表示します。
IDE では、テストケースを実行するための多くのオプションが用意されています。テストケースを一度にすべて実行したり、停止および開始したり、一度に 1 行ずつ実行したり、現在開発中の単一のコマンドを実行したり、テストスイート全体のバッチ実行を実行したりできます。テストケースの実行は、IDE で非常に柔軟です。
テストケースの実行
[実行] ボタンをクリックして、現在表示されているテストケースを実行します。
テストスイートの実行
[すべて実行] ボタンをクリックして、現在ロードされているテストスイート内のすべてのテストケースを実行します。
停止と開始
[一時停止] ボタンを使用して、実行中にテストケースを停止できます。このボタンのアイコンは、[再開] ボタンを示すように変わります。続行するには [再開] をクリックします。
途中で停止
テストケースにブレークポイントを設定して、特定のコマンドで停止させることができます。これは、テストケースのデバッグに役立ちます。ブレークポイントを設定するには、コマンドを選択し、右クリックして、コンテキストメニューから [ブレークポイントの切り替え] を選択します。
途中から開始
テストケースの中間の特定のコマンドから実行を開始するように IDE に指示できます。これもデバッグに使用されます。スタートポイントを設定するには、コマンドを選択し、右クリックして、コンテキストメニューから [スタートポイントの設定/クリア] を選択します。
単一のコマンドを実行する
単一のコマンドをダブルクリックして、それ自体を実行します。これは、単一のコマンドを作成する場合に役立ちます。正しいかどうかわからない場合に、構築しているコマンドをすぐにテストできます。ダブルクリックして、正しく実行されるかどうかを確認できます。これは、コンテキストメニューからも利用できます。
Selenium-IDE ウィンドウの上部にある [ベース URL] フィールドは、テストケースを異なるドメイン間で実行できるようにするために非常に役立ちます。たとえば、http://news.portal.com という名前のサイトに、http://beta.news.portal.com という名前の社内ベータサイトがあったとします。これらのサイトのテストケースで、open ステートメントで始まるものは、絶対 URL (http: または https: などのプロトコルで始まる URL) ではなく、相対 URL を open の引数として指定する必要があります。Selenium-IDE は、ベース URL の値の末尾に open コマンドの引数を追加することにより、絶対 URL を作成します。たとえば、次のテストケースは http://news.portal.com/about.html に対して実行されます。
ベース URL 設定が変更された同じテストケースは、http://beta.news.portal.com/about.html に対して実行されます。
Selenium コマンド (selenese とも呼ばれます) は、テストを実行するコマンドのセットです。これらのコマンドのシーケンスはテストスクリプトです。ここでは、これらのコマンドについて詳しく説明し、Selenium を使用するときに Web アプリケーションをテストする際の多くの選択肢を紹介します。
Selenium は、Web アプリを事実上あらゆる方法で完全にテストするための豊富なコマンドセットを提供します。コマンドセットは、selenese と呼ばれることがよくあります。これらのコマンドは、本質的にテスト言語を作成します。
selenese では、UI 要素の存在を HTML タグに基づいてテストしたり、特定の内容をテストしたり、リンク切れ、入力フィールド、選択リストオプション、フォームの送信、およびテーブルデータなどをテストできます。さらに、Selenium コマンドは、ウィンドウサイズ、マウス位置、アラート、Ajax 機能、ポップアップウィンドウ、イベント処理、およびその他の多くの Web アプリケーション機能をサポートしています。コマンドリファレンスには、利用可能なすべてのコマンドがリストされています。
コマンドは、Selenium に何をするかを指示します。Selenium コマンドには、アクション、アクセサ、および アサーション の 3 つの「種類」があります。
アクション は、通常、アプリケーションの状態を操作するコマンドです。これらは、「このリンクをクリックする」、「あのオプションを選択する」などの操作を行います。アクションが失敗した場合、またはエラーが発生した場合、現在のテストの実行は停止されます。
多くのアクションは、“AndWait” サフィックス (例: “clickAndWait”) を付けて呼び出すことができます。このサフィックスは、アクションによってブラウザがサーバーを呼び出すこと、および Selenium が新しいページがロードされるのを待機する必要があることを Selenium に伝えます。
アクセサ は、アプリケーションの状態を調べて、結果を変数に格納します (例: “storeTitle”)。これらは、アサーションを自動的に生成するためにも使用されます。
アサーション はアクセサに似ていますが、アプリケーションの状態が予想どおりであることを検証します。例としては、「ページタイトルが X であることを確認する」、「このチェックボックスがオンになっていることを検証する」などがあります。
すべての Selenium アサーションは、“assert”、“verify”、および “waitFor” の 3 つのモードで使用できます。たとえば、“assertText”、“verifyText”、および “waitForText” を使用できます。“assert” が失敗すると、テストは中止されます。“verify” が失敗すると、テストは実行を続行し、失敗をログに記録します。これにより、単一の “assert” でアプリケーションが正しいページにあることを確認し、その後に多数の “verify” アサーションを使用して、フォームフィールドの値、ラベルなどをテストできます。
“waitFor” コマンドは、何らかの条件が真になるのを待ちます (これは Ajax アプリケーションのテストに役立ちます)。条件がすでに真である場合、すぐに成功します。ただし、現在のタイムアウト設定内で条件が真にならない場合は、失敗してテストが停止します (以下の setTimeout アクションを参照)。
Selenium コマンドはシンプルで、コマンドと 2 つのパラメータで構成されています。例:
verifyText | //div//a[2] | ログイン |
パラメータは常に必須ではありません。コマンドによって異なります。場合によっては両方が必須であり、別の場合には 1 つのパラメータが必須であり、さらに別の場合にはコマンドがパラメータをまったく受け取らない場合があります。さらにいくつかの例を次に示します。
goBackAndWait | ||
verifyTextPresent | 私のホームページへようこそ | |
type | id=phone | (555) 666-7066 |
type | id=address1 | ${myVariableAddress} |
コマンドリファレンスでは、各コマンドのパラメータ要件について説明しています。
パラメータはさまざまですが、通常は次のとおりです。
ロケータ、テキストパターン、Selenium 変数、およびコマンド自体については、Selenium コマンドのセクションで詳細に説明します。
Selenium-IDE から実行される Selenium スクリプトは、HTML テキストファイル形式で保存されます。これは、3 つの列を持つ HTML テーブルで構成されています。最初の列は Selenium コマンドを識別し、2 番目の列はターゲット、最後の列は値を含みます。2 番目と 3 番目の列は、選択した Selenium コマンドによっては値を必要としない場合がありますが、存在する必要があります。各テーブル行は、新しい Selenium コマンドを表します。ページを開き、ページタイトルをアサートしてから、ページ上のコンテンツを検証するテストの例を次に示します。
<table>
<tr><td>open</td><td>/download/</td><td></td></tr>
<tr><td>assertTitle</td><td></td><td>Downloads</td></tr>
<tr><td>verifyText</td><td>//h2</td><td>Downloads</td></tr>
</table>
ブラウザでテーブルとしてレンダリングすると、次のようになります。
open | /download/ | |
assertTitle | ダウンロード | |
verifyText | //h2 | ダウンロード |
Selenese HTML 構文を使用すると、プログラミング言語の知識がなくてもテストを記述および実行できます。selenese と Selenium-IDE の基本的な知識があれば、テストケースを迅速に作成して実行できます。
テストスイートは、テストのコレクションです。多くの場合、テストスイート内のすべてのテストを 1 つの連続したバッチジョブとして実行します。
Selenium-IDE を使用する場合、テストスイートは単純な HTML ファイルを使用して定義することもできます。構文も再び単純です。HTML テーブルは、各行が各テストへのファイルシステムパスを定義するテストのリストを定義します。例を挙げればすべてがわかります。
<html>
<head>
<title>Test Suite Function Tests - Priority 1</title>
</head>
<body>
<table>
<tr><td><b>Suite Of Tests</b></td></tr>
<tr><td><a href="./Login.html">Login</a></td></tr>
<tr><td><a href="./SearchValues.html">Test Searching for Values</a></td></tr>
<tr><td><a href="./SaveValues.html">Test Save</a></td></tr>
</table>
</body>
</html>
これに似たファイルを使用すると、Selenium-IDE からテストを一度に 1 つずつ実行できます。
Selenium-RC を使用する場合でも、テストスイートを維持できます。これはプログラミングによって行われ、多くの方法で行うことができます。Java で Selenium-RC を使用している場合は、通常、Junit を使用してテストスイートを維持します。さらに、C# が選択された言語である場合は、Nunit を採用できます。Selenium-RC で Python のようなインタープリター型言語を使用している場合は、テストスイートのセットアップにいくつかの簡単なプログラミングが必要になります。Selenium-RC を使用する理由全体がテストにプログラミングロジックを利用することであるため、これは通常問題ではありません。
Selenium の紹介を締めくくるために、いくつかの典型的な Selenium コマンドを紹介します。これらは、おそらくテストを構築するために最も一般的に使用されるコマンドです。
open
URL を使用してページを開きます。
click/clickAndWait
クリック操作を実行し、オプションで新しいページがロードされるのを待機します。
verifyTitle/assertTitle
予想されるページタイトルを検証します。
verifyTextPresent
予想されるテキストがページ上のどこかにあることを検証します。
verifyElementPresent
HTML タグによって定義された、予想される UI 要素がページ上に存在することを検証します。
verifyText
予想されるテキストとその対応する HTML タグがページ上に存在することを検証します。
verifyTable
テーブルの予想される内容を検証します。
waitForPageToLoad
予想される新しいページがロードされるまで実行を一時停止します。clickAndWait が使用されている場合は自動的に呼び出されます。
waitForElementPresent
HTML タグによって定義された、予想される UI 要素がページ上に存在することを実行が一時停止するまで待機します。
Web ページ上の UI 要素を検証することは、おそらく自動テストの最も一般的な機能です。Selenese を使用すると、UI 要素をチェックする複数の方法が可能です。これらのさまざまな方法を理解することが重要です。なぜなら、これらの方法が実際に何をテストしているかを定義するからです。
たとえば、次のことをテストしますか?
たとえば、テキスト見出しをテストしている場合、テキストとそのページ上部での位置は、おそらくテストに関連します。ただし、ホームページ上の画像の存在をテストしていて、Web デザイナーが特定の画像ファイルをページ上の位置とともに頻繁に変更する場合、テストするのは、画像 (特定の画像ファイルではなく) がページ上のどこかに存在することだけです。
「assert」と「verify」のどちらを選ぶかは、利便性と失敗の管理によります。ブラウザが期待どおりのページを表示しているかどうかのチェックにすでに失敗している場合、ページの最初の段落が正しいかどうかをチェックすることはほとんど意味がありません。正しいページにいない場合、おそらくテストケースを中止して、原因を調査し、問題を迅速に修正したいと思うでしょう。一方、ページ上のすべての失敗を確認して適切なアクションを起こせるように、最初の失敗でテストケースを中止せずに、ページの多くの属性をチェックしたい場合もあるかもしれません。事実上、「assert」はテストを失敗させ、現在のテストケースを中止しますが、「verify」はテストを失敗させてもテストケースの実行を継続します。
この機能の最適な使用方法は、テストコマンドを論理的にグループ化し、各グループを「assert」で開始し、その後に1つまたは複数の「verify」テストコマンドを続けることです。以下に例を示します。
コマンド | ターゲット | 値 |
---|---|---|
open | /download/ | |
assertTitle | ダウンロード | |
verifyText | //h2 | ダウンロード |
assertTable | 1.2.1 | Selenium IDE |
verifyTable | 1.2.2 | June 3, 2008 |
verifyTable | 1.2.3 | 1.0 beta 2 |
上記の例では、最初にページを開き、次にタイトルを期待値と比較することで、正しいページがロードされたことを「assert」します。これが成功した場合にのみ、次のコマンドが実行され、テキストが期待される場所に存在することを「verify」します。次に、テストケースは、最初のテーブルの2行目の最初の列に期待値が含まれていることを「assert」し、これが成功した場合にのみ、その行の残りのセルが「verify」されます。
コマンドverifyTextPresent
は、特定のテキストがページ上のどこかに存在するかどうかを検証するために使用されます。単一の引数(検証するテキストパターン)を取ります。例:
コマンド | ターゲット | 値 |
---|---|---|
verifyTextPresent | Marketing Analysis |
これはSeleniumに、現在テスト中のページ上のどこかにテキスト文字列「Marketing Analysis」があるかどうかを検索して検証させます。ページ上にテキスト自体が存在することのみに関心がある場合は、verifyTextPresentを使用してください。テキストがページ上のどこにあるかをテストする必要がある場合は、これを使用しないでください。
テキストの内容ではなく、特定のUI要素の存在をテストする必要がある場合は、このコマンドを使用します。この検証ではテキストはチェックせず、HTMLタグのみをチェックします。一般的な使用例は、画像の存在をチェックすることです。
コマンド | ターゲット | 値 |
---|---|---|
verifyElementPresent | //div/p/img |
このコマンドは、<img>
HTMLタグの存在によって指定される画像がページ上に存在し、それが
タグに従っていることを検証します。最初(そして唯一)のパラメータは、Seleneseコマンドに要素の検索方法を指示するためのロケータです。ロケータについては、次のセクションで説明します。
verifyElementPresent
は、ページ内の任意のHTMLタグの存在をチェックするために使用できます。リンク、段落、div要素
コマンド | ターゲット | 値 |
---|---|---|
verifyElementPresent | //div/p | |
verifyElementPresent | //div/a | |
verifyElementPresent | id=Login | |
verifyElementPresent | link=Go to Marketing Research | |
verifyElementPresent | //a[2] | |
verifyElementPresent | //head/title |
これらの例は、UI要素をテストするさまざまな方法を示しています。繰り返しますが、ロケータについては次のセクションで説明します。
テキストとそのUI要素の両方をテストする必要がある場合は、verifyText
を使用します。verifyTextはロケータを使用する必要があります。XPathまたはDOMロケータを選択した場合、特定のテキストがページ上の他のUIコンポーネントに対する特定の場所に表示されることを検証できます。
コマンド | ターゲット | 値 |
---|---|---|
verifyText | //table/tr/td/div/p | これが私のテキストで、テーブル内のdivの直後にあります。 |
多くのSeleniumコマンドでは、ターゲットが必要です。このターゲットは、Webアプリケーションのコンテンツ内の要素を識別し、locatorType=location
形式のロケーション戦略とロケーションで構成されます。ロケータタイプは多くの場合省略できます。さまざまなロケータタイプについては、以下に例を挙げて説明します。
これはおそらく要素を特定する最も一般的な方法であり、認識されたロケータタイプが使用されない場合の包括的なデフォルトです。この戦略では、locationに一致するid属性値を持つ最初の要素が使用されます。一致するid属性を持つ要素がない場合、locationに一致するname属性を持つ最初の要素が使用されます。
たとえば、ページソースには、次のようにid属性とname属性を含めることができます。
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
</form>
</body>
<html>
次のロケータ戦略は、上記のHTMLスニペットから行番号で示された要素を返します。
identifier=loginForm
(3)identifier=password
(5)identifier=continue
(6)continue
(6)identifier
タイプのロケータはデフォルトであるため、上記の最初の3つの例ではidentifier=
は不要です。
このタイプのロケータは、identifierロケータタイプよりも限定的ですが、より明示的です。要素のid属性がわかっている場合は、これを使用します。
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>
id=loginForm
(3)nameロケータタイプは、一致するname属性を持つ最初の要素を特定します。複数の要素がname属性に同じ値を持っている場合は、フィルタを使用してロケーション戦略をさらに絞り込むことができます。デフォルトのフィルタタイプはvalue(value属性に一致)です。
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>
name=username
(4)name=continue value=Clear
(7)name=continue Clear
(7)name=continue type=button
(7)注:XPathおよびDOMロケータの一部のタイプとは異なり、上記の3つのタイプのロケータを使用すると、SeleniumはUI要素をページ上の場所に関係なくテストできます。そのため、ページ構造と構成が変更されても、テストは引き続き合格します。ページ構造の変更もテストするかどうかは、状況によります。Webデザイナーが頻繁にページを変更するが、その機能を回帰テストする必要がある場合、id属性とname属性、または実際には任意のHTMLプロパティを介したテストが非常に重要になります。
XPathは、XMLドキュメント内のノードを特定するために使用される言語です。HTMLはXML(XHTML)の実装になり得るため、Seleniumユーザーはこの強力な言語を活用して、Webアプリケーション内の要素をターゲットにすることができます。XPathは、id属性またはname属性で特定する単純な方法を超えて(およびサポートして)、ページ上の3番目のチェックボックスを特定するなど、あらゆる種類の新しい可能性を切り開きます。
XPathを使用する主な理由の1つは、特定したい要素に適切なid属性またはname属性がない場合です。XPathを使用して、要素を絶対パスで(推奨されませんが)、またはid属性またはname属性を持つ要素に対する相対パスで特定できます。XPathロケータは、id属性とname属性以外の属性を介して要素を指定するためにも使用できます。
絶対XPathには、ルート(html)からのすべての要素の場所が含まれており、その結果、アプリケーションにわずかな調整を加えただけで失敗する可能性があります。近くにid属性またはname属性(理想的には親要素)を持つ要素を見つけることで、関係に基づいてターゲット要素を特定できます。これは変更される可能性がはるかに低く、テストをより堅牢にすることができます。
xpath
ロケータのみが「//」で始まるため、XPathロケータを指定するときにxpath=
ラベルを含める必要はありません。
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>
xpath=/html/body/form[1]
(3) - 絶対パス(HTMLがわずかに変更されただけでも壊れます)//form[1]
(3) - HTML内の最初のform要素xpath=//form[@id='loginForm']
(3) - 属性名が「id」で値が「loginForm」のform要素xpath=//form[input/@name='username']
(3) - 属性名が「name」で値が「username」のinput子要素を持つ最初のform要素//input[@name='username']
(4) - 属性名が「name」で値が「username」の最初のinput要素//form[@id='loginForm']/input[1]
(4) - 属性名が「id」で値が「loginForm」のform要素の最初のinput子要素//input[@name='continue'][@type='button']
(7) - 属性名が「name」で値が「continue」、属性名が「type」で値が「button」のinput//form[@id='loginForm']/input[4]
(7) - 属性名が「id」で値が「loginForm」のform要素の4番目のinput子要素これらの例は基本的なものを網羅していますが、さらに詳しく学ぶためには、次の参考文献をお勧めします。
要素のXPathを発見するのに役立つ非常に便利なFirefoxアドオンもいくつかあります。
これは、リンクのテキストを使用してWebページ内のハイパーリンクを特定する簡単な方法です。同じテキストを持つ2つのリンクが存在する場合、最初の一致が使用されます。
<html>
<body>
<p>Are you sure you want to do this?</p>
<a href="continue.html">Continue</a>
<a href="cancel.html">Cancel</a>
</body>
<html>
link=Continue
(4)link=Cancel
(5)Document Object ModelはHTMLドキュメントを表し、JavaScriptを使用してアクセスできます。このロケーション戦略は、ページ上の要素に評価されるJavaScriptを使用します。これは、階層的なドット表記法を使用した要素の場所である可能性があります。
dom
ロケータのみが「document」で始まるため、DOMロケータを指定するときにdom=
ラベルを含める必要はありません。
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>
dom=document.getElementById('loginForm')
(3)dom=document.forms['loginForm']
(3)dom=document.forms[0]
(3)document.forms[0].username
(4)document.forms[0].elements['username']
(4)document.forms[0].elements[0]
(4)document.forms[0].elements[3]
(7)WebアプリケーションのDOMを探索するために、Selenium自体だけでなく、他のサイトや拡張機能も使用できます。W3Schoolsに良い参考文献があります。
CSS(Cascading Style Sheets)は、HTMLおよびXMLドキュメントのレンダリングを記述するための言語です。CSSはセレクタを使用して、ドキュメント内の要素にスタイルプロパティをバインドします。これらのセレクタは、Seleniumによって別のロケーション戦略として使用できます。
<html>
<body>
<form id="loginForm">
<input class="required" name="username" type="text" />
<input class="required passfield" name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>
css=form#loginForm
(3)css=input[name="username"]
(4)css=input.required[type="text"]
(4)css=input.passfield
(5)css=#loginForm input[type="button"]
(7)css=#loginForm input:nth-child(2)
(5)CSSセレクタの詳細については、W3Cの出版物を参照してください。そこに追加の参考文献があります。
次の状況では、ロケータタイプを省略することを選択できます。
明示的に定義されたロケータ戦略のないロケータは、デフォルトでidentifierロケータ戦略を使用します。「識別子による特定
_」を参照してください。
「//」で始まるロケータは、XPathロケータ戦略を使用します。「XPathによる特定
_」を参照してください。
「document」で始まるロケータは、DOMロケータ戦略を使用します。「DOMによる特定
_」を参照してください。
ロケータと同様に、パターンは、Seleneseコマンドで頻繁に必要となるパラメータのタイプです。パターンを必要とするコマンドの例は、verifyTextPresent、verifyTitle、verifyAlert、assertConfirmation、verifyText、およびverifyPromptです。また、上記で述べたように、リンクロケータはパターンを利用できます。パターンを使用すると、テキストを正確に指定するのではなく、特殊文字を使用して期待されるテキストを記述できます。
パターンには、グロビング、正規表現、および完全一致の3つのタイプがあります。
ほとんどの人は、DOSまたはUnix/Linuxコマンドライン(ls *.c
など)でのファイル名展開で使用されているため、グロビングに精通しています。この場合、グロビングは、現在のディレクトリに存在する.c
拡張子で終わるすべてのファイルを表示するために使用されます。グロビングはかなり限定されています。
Selenium実装でサポートされている特殊文字は2つだけです。
*
は「何にでも一致する」、つまり、何もない、単一の文字、または多くの文字に変換されます。
[ ]
(文字クラス)は、「角かっこ内にある任意の単一文字に一致する」に変換されます。ダッシュ(ハイフン)は、文字の範囲(ASCII文字セットで連続している)を指定するためのショートカットとして使用できます。いくつかの例で、文字クラスの機能が明確になります。
[aeiou]
は、任意の小文字の母音に一致します。
[0-9]
は、任意の数字に一致します。
[a-zA-Z0-9]
は、任意の英数字に一致します。
他のほとんどのコンテキストでは、グロビングには3番目の特殊文字である?が含まれています。ただし、Seleniumグロビングパターンは、アスタリスクと文字クラスのみをサポートしています。
Seleneseコマンドのグロビングパターンパラメータを指定するには、パターンの前にglob:ラベルを付けることができます。ただし、グロビングパターンはデフォルトであるため、ラベルを省略してパターン自体のみを指定することもできます。
以下は、グロビングパターンを使用する2つのコマンドの例です。テスト対象のページの実際のリンクテキストは「Film/Television Department」でした。正確なテキストではなくパターンを使用することで、リンクテキストが「Film & Television Department」または「Film and Television Department」に変更された場合でも、clickコマンドは機能します。グロブパターンのアスタリスクは、「Film」という単語と「Television」という単語の間の「任意のものまたは何もないもの」に一致します。
コマンド | ターゲット | 値 |
---|---|---|
click | link=glob:Film*Television Department | |
verifyTitle | glob:*Film*Television* |
リンクをクリックして到達したページの実際のタイトルは「De Anza Film And Television Department - Menu」でした。正確なテキストではなくパターンを使用することで、ページのタイトルに2つの単語「Film」と「Television」が(その順序で)表示されている限り、verifyTitle
は合格します。たとえば、ページの所有者がタイトルを「Film & Television Department」だけに短縮した場合でも、テストは引き続き合格します。リンクとリンクが機能したことを示す簡単なテスト(上記のverifyTitle
など)の両方にパターンを使用すると、そのようなテストケースのメンテナンスを大幅に削減できます。
正規表現パターンは、Seleneseがサポートする3つのタイプのパターンのうちで最も強力です。正規表現は、ほとんどの高水準プログラミング言語、多くのテキストエディタ、およびLinux/Unixコマンドラインユーティリティgrep、sed、およびawkを含む多数のツールでもサポートされています。Seleneseでは、正規表現パターンを使用すると、ユーザーはそうでなければ非常に困難な多くのタスクを実行できます。たとえば、テストで特定のテーブルセルに数字のみが含まれていることを確認する必要があるとします。regexp: [0-9]+
は、任意の長さの10進数に一致する単純なパターンです。
Seleneseグロビングパターンは*と[ ](文字クラス)機能のみをサポートしていますが、Selenese正規表現パターンはJavaScriptに存在する特殊文字と同じ幅広い配列を提供します。以下は、それらの特殊文字のサブセットです。
パターン | 一致 |
---|---|
. | . |
[ ] | [...] |
* | * |
+ | + |
? | ? |
{1,5} | {n,m} |
| | | |
( ) | (...) |
Seleneseの正規表現パターンには、regexp:
またはregexpi:
のいずれかのプレフィックスが必要です。前者は大文字と小文字を区別し、後者は大文字と小文字を区別しません。
いくつかの例で、正規表現パターンをSeleneseコマンドでどのように使用できるかを明確にするのに役立ちます。最初の例では、おそらく最も一般的に使用される正規表現パターンである.*(「ドットスター」)を使用しています。この2文字のシーケンスは、「0回以上の任意の文字の出現」またはより簡単に「任意のものまたは何もないもの」として翻訳できます。これは、1文字のグロビングパターン*(単一のアスタリスク)と同等です。
コマンド | ターゲット | 値 |
---|---|---|
click | link=glob:Film*Television Department | |
verifyTitle | regexp:.*Film.*Television.* |
上記の例は、この同じテストにグロビングパターンを使用した以前の例と機能的に同等です。唯一の違いは、プレフィックス(glob:の代わりにregexp:)と「任意のものまたは何もないもの」パターン(単なる*の代わりに.*)です。
より複雑な以下の例では、アラスカ州アンカレッジのYahoo!天気予報ページに日の出時刻に関する情報が含まれていることをテストします。
コマンド | ターゲット | 値 |
---|---|---|
open | http://weather.yahoo.com/forecast/USAK0012.html | |
verifyTextPresent | regexp:Sunrise: *[0-9]{1,2}:[0-9]{2} [ap]m |
上記の正規表現を一度に1つの部分ずつ見ていきましょう。
Sunrise: * | 文字列Sunrise:の後に0個以上のスペースが続きます。 |
[0-9]{1,2} | [0-9]{1,2} |
: | : |
[0-9]{2} | [0-9]{2} |
[ap]m | 「a」または「p」の後に「m」(午前または午後)が続きます。 |
Seleniumパターンのexactタイプは、有用性が低いものです。特殊文字をまったく使用しません。したがって、実際のアスタリスク文字(グロビングパターンと正規表現パターンの両方で特殊文字)を探す必要がある場合、exactパターンはそのための1つの方法になります。たとえば、ドロップダウンから「Real *」というラベルの付いたアイテムを選択する場合、次のコードが機能する場合と機能しない場合があります。glob:Real *
パターンのアスタリスクは、任意のものまたは何もないものに一致します。したがって、「Real Numbers」というラベルの付いた以前の選択肢があった場合、「Real *」オプションではなく、それが選択されるオプションになります。
コマンド | ターゲット | 値 |
---|---|---|
select | //select | glob:Real * |
「Real *」アイテムが確実に選択されるようにするために、exact:
プレフィックスを使用して、以下に示すようにexactパターンを作成できます。
コマンド | ターゲット | 値 |
---|---|---|
select | //select | exact:Real * |
ただし、同じ効果は、正規表現パターンでアスタリスクをエスケープすることで実現できます。
コマンド | ターゲット | 値 |
---|---|---|
select | //select | regexp:Real \* |
ほとんどのテスターがアスタリスクや、文字が中に入った角かっこ(グロビングパターンの文字クラス)を探す必要がなくなる可能性は低いです。したがって、グロビングパターンと正規表現パターンは、私たちの大多数にとって十分です。
コマンドとそのAndWait代替コマンドの違いは、通常のコマンド(clickなど)はアクションを実行し、可能な限り迅速に次のコマンドに進むのに対し、AndWait代替コマンド(clickAndWaitなど)は、アクションが完了した後、ページがロードされるまでSeleniumに待機するように指示することです。
AndWait代替コマンドは、アクションによってブラウザが別のページに移動したり、現在のページをリロードしたりする場合に常に使用されます。
AndWaitコマンドをナビゲーション/リフレッシュをトリガーしないアクションに使用すると、テストが失敗することに注意してください。これは、Seleniumがナビゲーションまたはリフレッシュが行われるのを確認せずにAndWaitのタイムアウトに達し、Seleniumがタイムアウト例外を発生させるために発生します。
AJAX駆動のWebアプリケーションでは、ページをリフレッシュせずにサーバーからデータが取得されます。andWaitコマンドを使用しても、ページが実際にはリフレッシュされないため、機能しません。テストの実行を一定期間一時停止することも、Web要素がシステムの応答性、負荷、またはその瞬間の他の制御不能な要因に応じて、規定された期間よりも後または早く表示される可能性があるため、テストの失敗につながるため、適切なアプローチではありません。最良のアプローチは、動的な期間に必要な要素を待機し、要素が見つかり次第実行を続行することです。
これは、waitForコマンド(waitForElementPresentやwaitForVisibleなど)を使用して行われます。これらのコマンドは動的に待機し、1秒ごとに目的の状態をチェックし、状態が満たされるとすぐにスクリプト内の次のコマンドに進みます。
スクリプトが実行されると、単に順番に、1つのコマンドの後に別のコマンドが実行されます。
Selenese自体は、条件文(if-elseなど)または反復処理(for、whileなど)をサポートしていません。多くの有用なテストは、フロー制御なしで実行できます。ただし、動的コンテンツの機能テスト、場合によっては複数のページを含む機能テストでは、多くの場合、プログラミングロジックが必要です。
フロー制御が必要な場合、3つのオプションがあります。
a) Selenium-RCと、JavaやPHPなどのクライアントライブラリを使用してスクリプトを実行し、プログラミング言語のフロー制御機能を利用します。b) storeEvalコマンドを使用して、スクリプト内から小さなJavaScriptスニペットを実行します。c) goto_sel_ide.js拡張機能
をインストールします。
ほとんどのテスターは、テストスクリプトをSelenium-RC APIを使用するプログラミング言語ファイルにエクスポートします(Selenium-IDEの章を参照)。ただし、一部の組織は、可能な限りSelenium-IDEからスクリプトを実行することを好みます(たとえば、多くのジュニアレベルの人がテストを実行している場合、またはプログラミングスキルが不足している場合)。これがあなたのケースである場合は、JavaScriptスニペットまたはgoto_sel_ide.js拡張機能を検討してください。
Selenium変数を使用して、スクリプトの先頭に定数を格納できます。また、(後のセクションで説明する)データ駆動型テスト設計と組み合わせると、Selenium変数は、コマンドライン、別のプログラム、またはファイルからテストプログラムに渡される値を格納するために使用できます。
プレーンなstoreコマンドは、多くのstoreコマンドの中で最も基本的なものであり、Selenium変数に定数値を単純に格納するために使用できます。2つのパラメータ(格納するテキスト値とSelenium変数)を取ります。変数名を選択するときは、英数字のみの標準的な変数命名規則を使用してください。
コマンド | ターゲット | 値 |
---|---|---|
store | paul@mysite.org |
スクリプトの後の方で、変数の格納された値を使用する必要があります。変数の値にアクセスするには、変数を波かっこ({})で囲み、次のようにドル記号($)を前に付けます。
コマンド | ターゲット | 値 |
---|---|---|
verifyText | //div/p | \${userName} |
変数の一般的な使用法は、入力フィールドの入力を格納することです。
コマンド | ターゲット | 値 |
---|---|---|
type | id=login | \${userName} |
Selenium変数は、最初または2番目のパラメータで使用でき、コマンドによって実行される他の操作の前にSeleniumによって解釈されます。Selenium変数は、ロケータ式内でも使用できます。
verifyコマンドとassertコマンドごとに、同等のstoreコマンドが存在します。以下に、より一般的に使用されるstoreコマンドをいくつか示します。
これはverifyElementPresentに対応します。UI要素が見つかったかどうかに応じて、ブール値(「true」または「false」)を単純に格納します。
StoreTextはverifyTextに対応します。ロケータを使用して特定のページテキストを識別します。テキストが見つかった場合、変数に格納されます。StoreTextは、テスト対象のページからテキストを抽出するために使用できます。
このコマンドは、最初のパラメータとしてスクリプトを取ります。SeleneseへのJavaScriptの埋め込みについては、次のセクションで説明します。StoreEvalを使用すると、テストはスクリプトの実行結果を変数に格納できます。
JavaScriptは、スクリプトパラメータと非スクリプトパラメータ(通常は式)の2種類のSeleneseパラメータで使用できます。ほとんどの場合、Seleneseパラメータとして使用されるJavaScriptスニペット内でテストケース変数にアクセスまたは操作する必要があります。テストケースで作成されたすべての変数は、JavaScriptの連想配列に格納されます。連想配列には、順次数値インデックスではなく、文字列インデックスがあります。テストケースの変数を含む連想配列は、storedVarsという名前です。JavaScriptスニペット内で変数にアクセスまたは操作する場合は、storedVars[‘yourVariableName’]として参照する必要があります。
いくつかのSeleneseコマンドは、assertEval、verifyEval、storeEval、およびwaitForEvalを含むscriptパラメータを指定します。これらのパラメータには特別な構文は必要ありません。Selenium-IDEユーザーは、JavaScriptコードのスニペットを適切なフィールド(通常はTargetフィールド)に配置するだけです(scriptパラメータは通常、最初または唯一のパラメータであるため)。
以下の例は、JavaScriptスニペットを使用して単純な数値計算を実行する方法を示しています。
コマンド | ターゲット | 値 |
---|---|---|
store | 10 | hits |
storeXpathCount | //blockquote | blockquotes |
storeEval | storedVars[‘hits’].storedVars[‘blockquotes’] | paragraphs |
次の例は、JavaScriptスニペットにメソッドの呼び出し(この場合はJavaScript StringオブジェクトのtoUpperCase
メソッドとtoLowerCase
メソッド)を含める方法を示しています。
コマンド | ターゲット | 値 |
---|---|---|
store | Edith Wharton | name |
storeEval | storedVars[’name’].toUpperCase() | uc |
storeEval | storedVars[’name’].toUpperCase() | lc |
JavaScriptは、パラメータがscriptタイプとして指定されていない場合でも、パラメータの値を生成するために使用することもできます。
ただし、この場合、特別な構文が必要です。パラメータ値全体は、javascript{
で始まり、JavaScriptスニペットを囲む末尾の}
が続く必要があります。例:javascript{*ここにコード*}
。以下は、type
コマンドの2番目のパラメータvalue
が、この特別な構文を使用してJavaScriptコードを介して生成される例です。
コマンド | ターゲット | 値 |
---|---|---|
store | league of nations | searchString |
type | q | javascript{storedVars[‘searchString’].toUpperCase()} |
Seleneseには、テストの出力にテキストを出力できる単純なコマンドがあります。これは、テストの実行中にコンソールに表示されるテストの有益な進行状況メモを提供するために役立ちます。これらのメモは、テスト結果レポート内でコンテキストを提供するためにも使用できます。これは、テストで問題が見つかった場合にページ上のどこに欠陥が存在するかを見つけるのに役立ちます。最後に、echoステートメントを使用してSelenium変数の内容を出力できます。
コマンド | ターゲット | 値 |
---|---|---|
echo | ページフッターをテストしています。 | |
echo | ユーザー名は\${userName}です |
次のようなページをテストしているとします。
<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
function output(resultText){
document.getElementById('output').childNodes[0].nodeValue=resultText;
}
function show_confirm(){
var confirmation=confirm("Chose an option.");
if (confirmation==true){
output("Confirmed.");
}
else{
output("Rejected!");
}
}
function show_alert(){
alert("I'm blocking!");
output("Alert is gone.");
}
function show_prompt(){
var response = prompt("What's the best web QA tool?","Selenium");
output(response);
}
function open_window(windowName){
window.open("newWindow.html",windowName);
}
</script>
</head>
<body>
<input type="button" id="btnConfirm" onclick="show_confirm()" value="Show confirm box" />
<input type="button" id="btnAlert" onclick="show_alert()" value="Show alert" />
<input type="button" id="btnPrompt" onclick="show_prompt()" value="Show prompt" />
<a href="newWindow.html" id="lnkNewWindow" target="_blank">New Window Link</a>
<input type="button" id="btnNewNamelessWindow" onclick="open_window()" value="Open Nameless Window" />
<input type="button" id="btnNewNamedWindow" onclick="open_window('Mike')" value="Open Named Window" />
<br />
<span id="output">
</span>
</body>
</html>
ユーザーは、アラート/確認ボックスに応答し、新しく開いたポップアップウィンドウにフォーカスを移動する必要があります。幸いなことに、SeleniumはJavaScriptポップアップをカバーできます。
ただし、アラート/確認/プロンプトを個別に説明する前に、それらの間の共通点を理解しておくと役立ちます。アラート、確認ボックス、およびプロンプトにはすべて、次のバリエーションがあります。
コマンド | 説明 |
---|---|
assertFoo(pattern) | パターンがポップアップのテキストと一致しない場合、エラーをスローします。 |
assertFooPresent | ポップアップが利用できない場合、エラーをスローします。 |
assertFooNotPresent | ポップアップが存在する場合、エラーをスローします。 |
storeFoo(variable) | ポップアップのテキストを変数に格納します。 |
storeFooPresent(variable) | ポップアップのテキストを変数に格納し、trueまたはfalseを返します。 |
Seleniumで実行する場合、JavaScriptポップアップは表示されません。これは、関数呼び出しが実際にはSelenium独自のJavaScriptによって実行時にオーバーライドされているためです。ただし、ポップアップが表示されないからといって、対処する必要がないわけではありません。ポップアップを処理するには、そのassertFoo(pattern)
関数を呼び出す必要があります。ポップアップの存在をアサートしないと、次のコマンドがブロックされ、次のようなエラーが発生します。[エラー] エラー: 予期しない確認ダイアログがありました! [オプションを選択しました。]
アラートは処理する最も単純なポップアップであるため、アラートから始めましょう。まず、上記のHTMLサンプルをブラウザで開き、「アラートを表示」ボタンをクリックします。アラートを閉じると、「アラートは消えました。」というテキストがページに表示されることに気付くでしょう。Selenium IDEの記録で同じ手順を実行し、アラートを閉じた後にテキストが追加されることを確認します。テストは次のようになります。
コマンド | ターゲット | 値 |
---|---|---|
open | / | |
click | btnAlert | |
assertAlert | 私は邪魔をしています! | |
verifyTextPresent | アラートは消えました。 |
「それはおかしい、私はそのアラートをアサートしようとしたことはない」と思うかもしれません。しかし、これはSelenium-IDEがアラートを処理して閉じているためです。そのステップを削除してテストを再生すると、次のエラーが発生します。[エラー] エラー: 予期しないアラートがありました! [私は邪魔をしています!]
。アラートの存在を確認するには、アラートのアサーションを含める必要があります。
アラートが存在することをアサートしたいだけで、テキストの内容を知らないか、気にしない場合は、assertAlertPresent
を使用できます。これはtrueまたはfalseを返し、falseの場合はテストを停止します。
確認ダイアログはアラートとほぼ同じように動作し、assertConfirmation
とassertConfirmationPresent
はアラート対応物と同じ特性を提供します。ただし、デフォルトでは、Seleniumは確認ダイアログが表示されたときに[OK]を選択します。サンプルページの「確認ボックスを表示」ボタンをクリックして記録してみてください。ただし、ポップアップで[キャンセル]ボタンをクリックしてから、出力テキストをアサートします。テストは次のようになる可能性があります。
コマンド | ターゲット | 値 |
---|---|---|
open | / | |
click | btnConfirm | |
chooseCancelOnNextConfirmation | ||
assertConfirmation | オプションを選択してください。 | |
verifyTextPresent | 拒否されました |
chooseCancelOnNextConfirmation
関数は、後続のすべての確認ダイアログがfalseを返す必要があることをSeleniumに通知します。chooseOkOnNextConfirmationを呼び出すことでリセットできます。
このテストを再生できないことに気付くかもしれません。Seleniumは、未処理の確認ダイアログがあると不満を述べているためです。これは、Selenium-IDEが記録するイベントの順序により、clickとchooseCancelOnNextConfirmationが間違った順序で配置されるためです(よく考えてみると理にかなっています。Seleniumは、確認ダイアログを開く前にキャンセルすることを知ることができません)。これらの2つのコマンドを切り替えるだけで、テストは正常に実行されます。
プロンプトはアラートとほぼ同じように動作し、assertPrompt
とassertPromptPresent
はアラート対応物と同じ特性を提供します。デフォルトでは、Seleniumはプロンプトが表示されたときにデータの入力を待ちます。サンプルページの「プロンプトを表示」ボタンをクリックして記録し、プロンプトに「Selenium」と入力してみてください。テストは次のようになる可能性があります。
コマンド | ターゲット | 値 |
---|---|---|
open | / | |
answerOnNextPrompt | Selenium! | |
click | id=btnPrompt | |
assertPrompt | 最高のWeb QAツールは何ですか? | |
verifyTextPresent | Selenium! |
プロンプトで[キャンセル]を選択すると、answerOnNextPromptは単に空白のターゲットを表示することに気付くかもしれません。Seleniumは、プロンプトでのキャンセルと空白のエントリを基本的に同じものとして扱います。
デバッグとは、テストケースのエラーを見つけて修正することを意味します。これは、テストケース開発の通常のプロセスの一部です。
ここではデバッグについて教えませんが、Seleniumのほとんどの新規ユーザーはすでにデバッグに関する基本的な経験を持っているでしょう。これが初めての場合は、組織の開発者の1人に尋ねることをお勧めします。
Sel-IDEは、ブレークポイントの設定と、テストケース内の任意のポイントからテストケースの実行を開始および停止する機能をサポートしています。つまり、テストケースの中間の特定のコマンドまで実行し、その時点でテストケースがどのように動作するかを検査できます。これを行うには、検査するコマンドの直前のコマンドにブレークポイントを設定します。
ブレークポイントを設定するには、コマンドを選択し、右クリックして、コンテキストメニューから[ブレークポイントの切り替え]を選択します。次に、[実行]ボタンをクリックして、テストケースを最初からブレークポイントまで実行します。
また、テストケースの中間から最後まで、または開始点に続くブレークポイントまでテストケースを実行すると便利な場合もあります。
たとえば、テストケースが最初にWebサイトにログインし、次に一連のテストを実行し、それらのテストの1つをデバッグしようとしているとします。
ただし、ログインは1回だけ行う必要がありますが、テストを開発する際にテストを再実行し続ける必要があります。ログインを1回だけ行い、テストケースのログイン部分の後に開始点を配置してから、テストケースを実行できます。これにより、テストケースを再実行するたびに手動でログアウトする必要がなくなります。
開始点を設定するには、コマンドを選択し、右クリックして、コンテキストメニューから[開始点を設定/クリア]を選択します。次に、[実行]ボタンをクリックして、その開始点から始まるテストケースを実行します。
テストケースを一度に1つのコマンドずつ実行する(「ステップ実行」する)には、次の手順に従います。
ツールバーの[実行]ボタンでテストケースの実行を開始します。
すぐに[一時停止]ボタンで実行中のテストケースを一時停止します。
[ステップ]ボタンを繰り返し選択します。
[検索]ボタンは、現在選択されているSeleniumコマンドで使用されている現在の表示中のWebページ(ブラウザ内)のUI要素を確認するために使用されます。
これは、コマンドの最初のパラメータのロケータを構築するときに役立ちます(Seleniumコマンドの章の:ref:ロケータ <locators-section>
セクションを参照)。Webページ上のUI要素を識別する任意のコマンド(click、clickAndWait、type、および特定のassertおよびverifyコマンドなど)で使用できます。
テーブルビューから、ロケータパラメータを持つ任意のコマンドを選択します。[検索]ボタンをクリックします。
次に、Webページを見てください。ロケータパラメータで指定された要素を囲む明るい緑色の長方形が表示されるはずです。
多くの場合、テストケースをデバッグするときは、単にページソース(テストしようとしているWebページのHTML)を見て問題を特定する必要があります。Firefoxを使用すると、これが簡単になります。Webページを右クリックして、[表示]->[ページのソース]を選択するだけです。
HTMLが別のウィンドウで開きます。その検索機能([編集]->[検索])を使用してキーワードを検索し、テストしようとしているUI要素のHTMLを見つけます。
または、ソースを表示するWebページのその部分だけを選択します。次に、Webページを右クリックして、[選択した部分のソースを表示]を選択します。この場合、別のHTMLウィンドウには少量のソースのみが含まれ、選択を表す部分が強調表示されます。
Selenium-IDE がロケータータイプの引数を記録する際、ユーザーが代わりに使用できる可能性のある他のロケータータイプの引数を表示できるように、追加情報を保存します。この機能は、ロケーターについてより深く学ぶのに非常に役立ち、記録されたタイプとは異なるタイプのロケーターを構築するのに役立つことがよくあります。
このロケーターアシスタンスは、Selenium-IDE ウィンドウの Target フィールドの右端にあるドロップダウンリストとして表示されます(Target フィールドに記録されたロケータータイプの引数が含まれている場合のみ)。
以下は、あるコマンドのこのドロップダウンの内容を示すスナップショットです。ドロップダウンの最初の列は代替ロケーターを提供し、2番目の列は各代替のタイプを示していることに注意してください。
テストスイートとは、IDE の左端のペインに表示されるテストケースの集まりです。
テストスイートペインは、ペインの右端の中央付近にある小さなドットを選択することで手動で開閉できます(ペインが閉じている場合は、Selenium-IDE ウィンドウ全体の左端になります)。
テストスイートペインは、既存のテストスイートが開かれたとき、またはユーザーが [ファイル] メニューから [新規テストケース] 項目を選択したときに自動的に開きます。後者の場合、新しいテストケースは直前のテストケースのすぐ下に表示されます。
Selenium-IDE は、[ファイル] -> [テストケースを追加] メニューオプションを使用して、既存のテストケースをロードすることもサポートしています。これにより、既存のテストケースを新しいテストスイートに追加できます。
テストスイートファイルは、1列のテーブルを含む HTML ファイルです。各セクションの各行の各セルには、テストケースへのリンクが含まれています。以下の例は、4 つのテストケースを含むテストスイートの例です。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Sample Selenium Test Suite</title>
</head>
<body>
<table cellpadding="1" cellspacing="1" border="1">
<thead>
<tr><td>Test Cases for De Anza A-Z Directory Links</td></tr>
</thead>
<tbody>
<tr><td><a href="./a.html">A Links</a></td></tr>
<tr><td><a href="./b.html">B Links</a></td></tr>
<tr><td><a href="./c.html">C Links</a></td></tr>
<tr><td><a href="./d.html">D Links</a></td></tr>
</tbody>
</table>
</body>
</html>
注: テストケースファイルは、それらを呼び出すテストスイートファイルと同じ場所に配置する必要はありません。そして、Mac OS および Linux システムでは、実際にそのようになっています。ただし、この記事の執筆時点では、バグにより Windows ユーザーはテストケースをそれらを呼び出すテストスイートとは別の場所に配置することができません。
ユーザー拡張機能は、追加機能を追加するための独自のカスタマイズと機能を作成できる JavaScript ファイルです。多くの場合、これはカスタマイズされたコマンドの形を取りますが、この拡張性は追加のコマンドに限定されません。
ユーザーによって作成された多くの有用な拡張機能があります。
重要: このセクションは古くなっています – 近日中に改訂する予定です。
おそらく、すべての Selenium-IDE 拡張機能の中で最も人気があるのは、while ループと基本的な条件分岐の形でフロー制御を提供するものです。この拡張機能は goto_sel_ide.js_ です。この拡張機能によって提供される機能の使用方法の例については、その作成者によって作成されたページ_ を参照してください。
この拡張機能をインストールするには、Selenium-IDE の [オプション] -> [オプション] -> [一般] タブの [Selenium Core extensions] フィールドに、コンピューター上のその場所へのパス名を入力します。
[OK] ボタンを選択した後、拡張機能ファイルを読み込むために Selenium-IDE を閉じて再度開く必要があります。拡張機能に加えた変更も、Selenium-IDE を閉じて再度開く必要があります。
独自の拡張機能の作成に関する情報は、Selenium Reference_ ドキュメントの下部付近にあります。
Selenium IDE とユーザー拡張機能をステップバイステップでデバッグすることは非常に役立つ場合があります。XUL/Chrome ベースの拡張機能をデバッグできる唯一のデバッガーは Venkman であり、これは Firefox バージョン 32 までサポートされています。ステップバイステップデバッグは、Firefox 32 および Selenium IDE 2.9.0 で動作することが確認されています。
[オプション] メニューの [フォーマット] では、テストケースの保存と表示に使用する言語を選択できます。デフォルトは HTML です。
Selenium-RC を使用してテストケースを実行する場合、この機能はテストケースをプログラミング言語に変換するために使用されます。Selenium-RC でテストプログラムを開発するために使用する言語(例:Java、PHP)を選択します。次に、[ファイル] -> [テストケースをエクスポート] を使用してテストケースを保存するだけです。テストケースは、選択した言語の一連の関数に変換されます。基本的に、テストをサポートするプログラムコードが Selenium-IDE によって生成されます。
また、生成されたコードがニーズに合わない場合は、生成プロセスを定義する構成ファイルを編集して変更できることに注意してください。
サポートされている各言語には、編集可能な構成設定があります。これは、[オプション] -> [オプション] -> [フォーマット] タブの下にあります。
Selenium-IDE は Firefox に対してのみテストを実行できますが、Selenium-IDE で開発されたテストは、Selenium-RC サーバーを起動する簡単なコマンドラインインターフェイスを使用して、他のブラウザーに対して実行できます。このトピックは、Selenium-RC の章の :ref:Selenese テストの実行 <html-suite>
セクションで説明されています。-htmlSuite コマンドラインオプションが特に注目すべき機能です。
以下は、Selenium-IDE で頻繁に発生する問題の原因を説明する画像/説明のペアのリストです。
テーブルビューはこのフォーマットでは利用できません。
このメッセージは、Selenium IDE の起動時に [テーブル] タブに時々表示されることがあります。回避策は、Selenium IDE を閉じて再度開くことです。詳細については、issue 1008 を参照してください。この問題を確実に再現できる場合は、修正に取り組むことができるように詳細を提供してください。
テストケースのロードエラー: コマンドが見つかりません
[ファイル] -> [開く] を使用してテストスイートファイルを開こうとしました。[ファイル] -> [テストスイートを開く] を代わりに使用してください。
このエラーメッセージを改善するための機能拡張リクエストが提起されています。issue 1010 を参照してください。
このタイプの エラー は、タイミングの問題、つまり、コマンド内のロケーターで指定された要素がコマンドの実行時に完全にロードされていなかったことを示している可能性があります。問題が実際にタイミングに関連しているかどうかを判断するには、コマンドの前に pause 5000 を入れてみてください。そうである場合は、失敗しているコマンドの前に適切な waitFor* または *AndWait コマンドを使用することを検討してください。
上記の open コマンドの場合のように、変数置換を使用しようとして失敗した場合は、アクセスしようとしている値を持つ変数が実際には作成されていないことを示しています。これは、変数を Value フィールドに入れるべきときに Target フィールドに入れたり、またはその逆の場合に発生することがあります。上記の例では、store コマンドの 2 つのパラメーターが、必要な順序とは逆の順序で誤って配置されています。Selenese コマンドの場合、最初の必須パラメーターは Target フィールドに、2 番目の必須パラメーター(存在する場合)は Value フィールドに入れる必要があります。
テストケースのロードエラー: [Exception… “Component returned failure code: 0x80520012 (NS_ERROR_FILE_NOT_FOUND) [nsIFileInputStream.init]” nresult: “0x80520012 (NS_ERROR_FILE_NOT_FOUND)” location: “JS frame :: chrome://selenium-ide/content/file-utils.js :: anonymous :: line 48” data: no]
テストスイート内のテストケースの 1 つが見つかりません。テストケースが実際にテストスイートが示す場所に配置されていることを確認してください。また、実際のテストケースファイルにファイル名と、それらが参照されているテストスイートファイルの両方で .html 拡張子が付いていることを確認してください。
このエラーメッセージを改善するための機能拡張リクエストが提起されています。issue 1011 を参照してください。
拡張機能ファイルの内容が Selenium-IDE によって読み取られていません。[オプション] -> [オプション] -> [一般] の [Selenium Core extensions] フィールドで、拡張機能ファイルへの適切なパス名を指定していることを確認してください。また、拡張機能ファイルまたは [Selenium Core extensions] フィールドの内容を変更した後は、Selenium-IDE を再起動する必要があります。
コマンドラインから HTML Selenium IDE エクスポートを実行する
Selenium IDE は、記録と再生のためのオリジナルの Firefox 拡張機能でした。バージョン 2.x は WebDriver をサポートするように更新されました。
詳細またはスポンサーの完全なリストをご覧ください。