Selenium のコマンド

しばしば selenese とも呼ばれる Selenium のコマンドは、テストを実行するコマンドのことです。これらのコマンドを並べたものが テストスクリプト を構成します。この章では、Selenium のコマンドについて詳しく取り上げ、Selenium を使って Web アプリケーションをテストするためのさまざまな方法を示します。

ページの要素の検証

ページ上の UI 要素の検証は、自動化されたテストではおそらく最もよく使われる機能でしょう。Selenese では、UI 要素をさまざまな方法でチェックすることができます。実際のテスト対象はどの方法を使うかによって左右されるので、これらの方法の違いを理解することが重要になります。

たとえば、現在テストしようとしているのは、次のどれでしょうか。

  1. ある要素がページ上のどこかに存在しているかどうか。
  2. 特定のテキストがページ上のどこかに存在しているかどうか。
  3. 特定のテキストがページ上の特定の場所に存在しているかどうか。

テキスト見出しをテストする場合、おそらくテスト対象として適しているのは、ページ先頭のテキストとその位置でしょう。一方、画像がホームページ上に存在するかどうかをテストする場合で、Web デザイナーが具体的な画像ファイルとそのページ上の位置を頻繁に変更しているようなケースでは、(具体的な画像ファイルではなく) 画像ページ上のどこか に存在しているかどうかをテストする方が適切でしょう。

アサーションと検証

“assert” (アサート) と “verify” (検証) のどちらを使うかは、利便性、そしてエラーの扱いをどうするかによって決まります。期待されたページがブラウザに表示されているかどうかをチェックするテストがすでに失敗しているのに、そのページの最初のパラグラフが正しいものかどうかをチェックしても、ほとんど意味はありません。目的のページが表示されていなければ、テストケースを中止して、何が原因かすぐ調べて、問題を解決した方がよいでしょう。一方、最初のエラーでテストケースを中止せず、ページ上の多くの属性をチェックしたい場合もあります。こうすれば、該当するページ上のすべてのエラーをまとめて見直し、適切な対応策を講じることができます。Selenium のコマンドを使う場合、”assert” では、テストがエラーになり、現在のテストケースは中止されますが、”verify” では、テストはエラーになるものの、テストケースの実行は続行されます。

この機能を上手に活用するには、テストのコマンドを論理的にグループ化し、各グループを “assert” で始め、その後に 1 つまたは複数の “verify” コマンドを続けて記述します。次に例を示します。

コマンド 対象
open /download/  
assertTitle Downloads  
verifyText //h2 Downloads
assertTable 1.2.1 Selenium IDE
verifyTable 1.2.2 June 3, 2008
verifyTable 1.2.3 1.0 beta 2

この例では、最初にページを開き、ページのタイトルと期待される値とを比較して、正しいページが読み込まれたどうかを「アサート」します。このテストをパスした場合にのみ、続くコマンドが実行され、指定したテキストが指定した場所に存在するかどうかを「検証」します。テストケースでは次に、最初のテーブルの 2 行目の 1 列目に、期待された値が含まれているかどうかを「アサート」し、このテストをパスした場合にのみ、同じ行のほかの列を「検証」するようにしています。

verifyTextPresent

verifyTextPresent コマンドは、 特定のテキストがページ上のどこかに存在すること を検証するのに使います。このコマンドは引数を 1 つだけ取ります。引数には、検証するテキストのパターンを指定します。次に例を示します。

コマンド 対象
verifyTextPresent Marketing Analysis  

この例では、現在テストの対象になっているページ上で “Marketing Analysis” というテキスト文字列を探し、この文字列がページ上のどこかにあるかどうかを検証します。 verifyTextPresent コマンドは、テキストそれ自体がページ上に存在するかどうかだけを調べるときに使います。テキストがページ上に現れる場所もテストの対象に含める必要がある場合には、このコマンドは使わないでください。

verifyElementPresent

verifyElementPresent コマンドは、特定の UI 要素について、その内容ではなく、要素の存在自体をチェックするのに使います。具体的にはテキストはチェックせず、HTML タグだけをチェックします。一般的な使い方として、画像が存在するかどうかのチェックなどがあります。

コマンド 対象
verifyElementPresent //div/p/img  

この例では、<img> HTML タグの存在によって指定される画像が、ページ上に存在するかどうか、そして <img> タグが <div> タグと <p> タグに続いて出現するかどうかを検証しています。最初の (1 つだけの) パラメータは、要素を探す方法を 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 要素をさまざまな方法でチェックできることを示しています。繰り返しになりますが、ロケータについては次のセクションで説明します。

verifyText

verifyText は、テキストとその UI 要素の両方をテストする必要がある場合に使います。 verifyText では、ロケータを使う必要があります。 XPath または DOM ロケータを使う場合は、特定のテキストが、ページ上のほかの UI コンポーネントとの相対位置で指定される特定の場所に出現するかどうかを検証できます。

コマンド 対象
verifyText //table/tr/td/div/p This is my text and it occurs right after the div inside the table.

要素の特定

多くの Selenium コマンドでは、対象を指定する必要があります。この対象は、Web アプリケーションのコンテキスト内で要素を特定するためのもので、ロケーションストラテジーに続けて、 locatorType=location の形でロケーションを指定します。多くの場合、ロケーションのタイプは省略できます。ロケーションのタイプについては、以下で例を挙げながら説明します。

デフォルトのロケータ

次のような場合には、ロケータタイプを省略できます。

  • “document” で始まるロケータでは DOM ロケータストラテジーを使います。 DOM による特定 を参照してください。
  • “//” で始めるロケータでは XPath ロケータストラテジーを使います。 XPath による特定 を参照してください。
  • 上に示した以外のもので始まるロケータ、または有効なロケータでは、デフォルトで、識別子ロケータストラテジーを使います。 識別子による特定 を参照してください。

識別子による特定

この方法は、要素を特定する方法としておそらく最も一般的で、ロケータタイプとして認識されるものが使われていない場合の汎用デフォルトです。このストラテジーでは、id 属性を持つ要素のうち、ロケーションに一致する最初の要素が使われます。id 属性に一致する要素がない場合には、name 属性を持つ要素のうち、ロケーションに一致する最初の要素が使われます。

たとえば、ページソースに次のような id 属性と name 属性があったとします。

1
2
3
4
5
6
7
8
9
<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=username (4)
  • identifier=continue (5)
  • continue (5)

identifier タイプのロケータはデフォルトなので、上の最初の 3 つの例では identifier= を省略できます。

id による特定

このタイプのロケータは identifier ロケータタイプよりも限定の度合いは高くなりますが、それと同時に、より明示的になります。要素の id 属性がわかっている場合に使用します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
 <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 ロケータタイプは、nama 属性に一致する最初の要素を特定します。1 つの name 属性に対して、複数の要素が同じ値を持っている場合には、フィルタを使ってロケーションストラテジーの精度を高めることができます。デフォルトのフィルタタイプは value です (value 属性に一致)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
 <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 つのタイプのロケータを使えば、ページ上の位置に関係なく UI 要素をテストすることができます。したがって、ページの構造や構成が変わっても、テストはパスします。ページの構造が変わったかどうかについては、テストしたい場合もテストしたくない場合もあるでしょう。Web デザイナーが頻繁にページに手を加えていて、ページの機能を回帰テストの対象にする必要がある場合には、id 属性や name 属性、または任意の HTML プロパティによるテストが非常に重要になります。

XPath による特定

XPath は、XML ドキュメント内のノードを特定するために使われる言語です。HTML は XML (XHTML) の実装でもありうるので、Selenium ユーザーは XPath という強力な言語を使って、Web アプリケーション内の要素を特定することができます。XPath は、id 属性や name 属性による要素の特定という単純な方法を (サポートすると当時に) さらに拡張しており、ページ上の 3 番目のチェックボックスを特定するなど、あらゆる種類の新しい可能性を開いてくれる言語です。

XPath を使う主な理由の 1 つは、特定したい要素に対応する適切な id 属性や name 属性がない場合があることです。XPath を使うと、要素を絶対的に特定したり (ただし、このやり方は推奨されません)、id 属性または name 属性を持つ要素からの相対位置で要素を特定したりできます。XPath ロケータを使って、id や name 以外の属性から要素を特定することもできます。

絶対 XPath には、ルート (html) からのすべての要素の位置が含まれており、したがって 、アプリケーションにわずかな変更を加えただけで、XPath による特定がうまくいかなる可能性があります。id 属性または name 属性を持つ近くの要素 (理想的には親要素) を見つけることによって、対象となる要素を相対関係に基づいて特定できるようになります。これは、アプリケーションに変更が加えられても変わる可能性は低く、テストをより着実なものにすることができます。

“//” で始まるのは xpath ロケータだけなので、XPath ロケータを指定するときに xpath= ラベルを含める必要はありません。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
 <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 内の最初のフォーム要素
  • xpath=//form[@id='loginForm'] (3) - ‘id’ という名前の属性と ‘loginForm’ という値を持つフォーム要素
  • xpath=//form[input/\@name='username'] (4) - ‘name’ という名前の属性と ‘username’ という値を持つ input 子要素を持つ最初のフォーム要素
  • //input[@name='username'] (4) - ‘name’ という名前の属性と ‘username’ という値を持つ最初の input 要素
  • //form[@id='loginForm']/input[1] (4) - ‘id’ という名前の属性と ‘loginForm’ という値を持つフォーム要素の最初の input 子要素
  • //input[@name='continue'][@type='button'] (7) - ‘name’ という名前の属性と ‘continue’ という値、’type’ という名前の属性と ‘button’ という値を持つ input 要素
  • //form[@id='loginForm']/input[4] (7) - ‘id’ という名前の属性と ‘loginForm’ という値を持つフォーム要素の 4 番目の input 子要素

これらの例では、いくつかの基本的な使い方を示しています。XPath の指定方法の詳細については、次の参考資料を読むことをお勧めします。

要素の XPath を見つけるのに役立つ非常に有益な Firefox アドオンもいくつか存在します。

  • XPath Checker - XPath の案が提示され、ユーザーは XPath の結果をテストすることができます。
  • Firebug - XPath の案を提示します。非常に便利なこのアドインが持つ多くの機能のうちの 1 つです。

リンクテキストによるハイパーリンクの特定

リンクのテキストを使って Web ページのハイパーリンクを特定する簡単な方法です。テキストが同じリンクが 2 つ存在する場合には、最初に一致したものが使われます。

1
2
3
4
5
6
7
<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)

DOM による特定

DOM (Document Object Model) は HTML ドキュメントを表現したもので、JavaScript を使ってアクセスできます。このロケーションストラテジーでは、ページ上の要素に評価される JavaScript を使用します。単に階層型ドット記法を使って要素の位置を特定できます。

“document” で始まるのは dom ロケータだけなので、DOM ロケータを指定する時に dom= ラベルを含める必要はありません。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
 <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)

Selenium それ自体に加え、ほかのサイトや拡張機能を利用すれば、作成中のアプリケーションの DOM について詳しく知ることができます。 W3Schools には優れたリファレンスがあります。

CSS による特定

CSS (Cascading Style Sheets) は、HTML ドキュメントと XML ドキュメントのレンダリングについて記述するための言語です。CSS では、セレクタを使って、ドキュメント内の要素にスタイルプロパティをバインドしています。Selenium では、これらのセレクタをロケーションストラテジーとして利用できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
 <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"] (4)
  • css=#loginForm input:nth-child(2) (5)

CSS のセレクタの詳細について知るための最も適切な場所は、 W3C のドキュメント です。詳しいリファレンスもここにあります。

ノート

Selenium のほとんどの熟練ユーザーは、ロケーションストラテジーとして CSS を使うことを推奨しています。CSS を使う方法は XPath を使う場合より高速で、HTML ドキュメント内に存在するかなり込み入ったオブジェクトも特定できるからです。

テキストパターンとの一致

ロケータ同様、 パターン も Selenese コマンドでしばしば必要になるタイプのパラメータです。パターンを指定する必要があるコマンドとしては、 verifyTextPresentverifyTitleverifyAlertassertConfirmationverifyTextverifyPrompt などがあります。また、すでに示したリンクロケータでも、パターンを使用できます。パターンを使うと、テキストを正確に指定しなくても、期待されるテキストを特殊文字の使用を通じて 記述 することができます。

パターンには、 グロビング正規表現完全一致 の 3 つの種類があります。

グロビングパターン

ほとんどのユーザーは、グロビングについてはすでによく知っていることでしょう。グロビングは、DOS や Unix/Linux のコマンドラインで ls *.c などとしてファイル名を展開するときに使われています。この例では、現在のディレクトリ内に存在する拡張子 .c で終わるすべてのファイルが表示されます。グロビングにはかなり制限があります。Selenium の実装でサポートされている特殊文字は、次の 2 つだけです。

* 。「何にでも一致」します。すなわち、何もなし、1 文字だけ、複数の文字のすべてに一致します。

[ ] (文字クラス)。「角かっこ内の任意の 1 文字に一致」します。ダッシュ文字 (ハイフン。 “-“) を使って文字の範囲 (ASCII 文字セットで連続する文字の範囲) を指定できます。文字クラスのはたらきについては、いくつか実例を挙げた方がわかりやすいでしょう。

[aeiou] は任意の小文字の母音に一致します。

[0-9] は任意の数字に一致します。

[a-zA-Z0-9] は任意の英数字に一致します。

グロビングのほとんどの実装では、3 つ目の特殊文字として ? が含まれています。しかし、Selenium のグロビングパターンでサポートされているのは、アスタリスク (*) と文字クラスだけです。

Selenese コマンドでグロビングパターンを指定するには、指定するパターンの前に glob: ラベルを付けます。ただし、グロビングパターンはデフォルトなので、このラベルを省略してパターンだけを指定することもできます。

次に示すのは、グロビングパターンの使用例です。ページ上の実際のリンクテキストは “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” でした。正確に一致するテキストではなく、パターンを使うと、ページのタイトルに “Film” と “Television” の 2 つの単語が (この順序で) 出現する限り、 verifyTitle はパスします。たとえば、ページのオーナーがタイトルを短縮して “Film & Television Department” としても、テストはパスします。リンクとリンクが動作するかどうかのテスト (上の例では verifyTitle) との両方でパターンを使うことで、こうしたテストケースの保守の手間を大幅に減らすことができます。

正規表現パターン

正規表現 パターンは、Selenese がサポートしている 3 種類のパターンの中で最も強力です。正規表現はほとんどの高水準プログラミング言語、多くのテキストエディタ、さらに Linux/Unix のコマンドラインユーティリティである grepsedawk など、さまざまなツールでもサポートされています。Selenese では、正規表現パターンを使うと、それ以外の方法では実現が難しい数多くのタスクを実行することができます。たとえば、テーブルの特定のセルに入力されているのが数字だけかどうかをテストする必要があるとします。この場合、 regexp: [0-9]+ と指定するだけで、任意の長さの数字に一致させることができます。

Selenese のグロビングパターンでサポートしているのは *[ ] (文字クラス) だけですが、Selenese の正規表現パターンでは JavaScript に存在するものと同じ幅広い特殊文字を使用できます。次に示すのは、これらの特殊文字です。

パターン 一致
. 任意の 1 文字
[ ] 文字クラス: 角かっこ内で指定された任意の文字
* 量指定子: 直前の文字 (またはグループ) の 0 回以上の繰り返し
+ 量指定子: 直前の文字 (またはグループ) の 1 回以上の繰り返し
? 量指定子: 直前の文字 (またはグループ) の 0 回または 1 回の繰り返し
{1,5} 量指定子: 直前の文字 (またはグループ) の 1-5 回の繰り返し
| OR 演算子: 左側の文字/グループまたは右側の文字/グループ
( ) グルーピング: しばしば OR 演算子や量指定子とともに使われます

Selenese の正規表現パターンでは、先頭に regexp: または regexpi: を付ける必要があります。前者は大文字と小文字を区別しますが、後者は大文字と小文字を区別しません。

Selenese コマンドでの正規表現パターンの使い方については、いくつか実例を挙げた方がわかりやすいでしょう。最初の例は、おそらく最もよく使われる正規表現である .* (“ドットスター”) を使ったものです。この 2 文字の並びは、「任意の文字の 0 回以上の繰り返し」、もっとかみくだいて言えば、「すべて、または何もない」ものに一致します。1 文字のグロビングパターンで * (アスタリスク 1 つ) と指定するのと等価です。

コマンド 対象
click link=regexp:Film.*Television Department  
verifyTitle regexp:.*Film.*Television.*  

上のテスト例は、すでに示したグロビングパターンを使ったテストの例と機能的には同じです。違いは、プリフィックス (glob: の代わりに regexp: が使われていること) と、「すべて、または何もない」パターンが指定されていること (* の代わりに .* が使われていること) だけです。

次に示すのは、アラスカ州アンカレジの日の出時刻に関する情報が掲載されている Yahoo! Weather のページを対象としたもう少し複雑なテスト例です。

コマンド 対象
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} 1 個または 2 個の数字 (時間を表す)
: 文字 : そのもの (特殊文字は使われていない)
[0-9]{2} 2 個の数字 (分を表す) とそれに続く 1 個の空白
[ap]m 文字 “a” または “p” とそれに続く “m” (am または pm)

完全一致

Selenium の 完全一致 パターンは、それほど使う機会はないでしょう。完全一致パターンでは、特殊文字は一切使いません。したがって、(グロビングパターンと正規表現パターンでは特別な意味を持つ) アスタリスク文字を検索する必要がある場合には、完全一致パターンを使うのも 1 つの方法です。たとえば、ドロップダウンリストで “Real *” というラベルの付いた項目を選択する場合、次のようなコードでは、期待どおりに動作する場合もそうでない場合もあります。 glob:Real * パターンに含まれるアスタリスクは、「すべて、または何もない」ものに一致します。したがって、目的の select のオプションより前に “Real Numbers” というラベルの付いたオプションがあれば、それが選択され、目的の “Real *” というオプションは選択されないことになります。

select //select glob:Real *

項目 “Real *” が確実に選択されるようにするには、 exact: プリフィックスを使って次のように 完全一致 パターンを指定します。

select //select exact:Real *

ただし、正規表現パターンで次のようにアスタリスクをエスケープしても同じ結果が得られます。

select //select regexp:Real \*

ほとんどのテスターは、アスタリスクや、文字が間に入った角かっこの対 (グロビングパターンの文字クラス指定) を検索する必要はないでしょう。したがって、大半のユーザーにとっては、グロビングパターンと正規表現パターンだけで十分なはずです。

“AndWait” コマンド

あるコマンドとそのコマンドに対応する AndWait コマンドとの違いは、通常のコマンド (click など) が、操作を実行すると可能な限り速やかに次のコマンドの実行を続けるのに対し、 AndWait コマンド (clickAndWait など) は、操作が実行された後、ページが読み込まれるまで 待機する よう Selenium に指示する点にあります。

目的の操作によってブラウザがほかのページに移動したり、現在のページをリロードしたりする場合には、常に AndWait コマンドを使います。

ただし、ほかのページへの移動やページの更新を伴わない操作に対して AndWait コマンドを使うと、テストは失敗します。テストが失敗する理由は、ほかのページへの移動や更新が行われないまま AndWait のタイムアウトに達して、Selenium がタイムアウト例外を発生させるためです。

AJAX アプリケーションにおける waitFor コマンド

AJAX 駆動型 Web アプリケーションでは、ページを更新することなく、サーバーからデータが取得されます。この場合、実際にはページが更新されないため、 andWait コマンドは動作しません。一定時間、テストの実行を停止するやり方も、優れた対応策とは言えません。当該時点でのシステムの応答性能、負荷、その他の制御不可能な要素によって、指定された時間よりも早く、あるいは遅く、目的の Web 要素が表示されることがあり、その場合にはテストが失敗するからです。最も適切なアプローチは、動的な期間、必要な要素が表示されるのを待って、要素が見つかり次第、テストの実行を続行するやり方です。

waitFor コマンドを使うと、このようなやり方を実現できます。 waitForElementPresentwaitForVisible は、動的な期間、待機し、目的の条件が満たされるかどうかを毎秒チェックし、条件が満たされると同時にスクリプトの次のコマンドの実行を続けます。

評価順序とフロー制御

スクリプトを実行すると、そのスクリプトに含まれるコマンドが順序に従って実行されます。

Selenese それ自体は、条件判定文 (if-else など) または反復 (for、while など) をサポートしていません。フロー制御を使わなくても、多くの有用なテストは実行できます。しかし、複数のページが関係することが多い動的コンテンツをきちんとテストするには、プログラミングロジックがしばしば必要になります。

フロー制御が必要になった場合には、次の 3 つの選択肢があります。

  1. Selenium-RC と、Java や PHP といったクライアントライブラリを使ってスクリプトを実行し、プログラミング言語の持つフロー制御機能を利用する。
  2. スクリプトの内部から storeEval コマンドを使って小さな JavaScript コードの断片を実行する。
  3. goto_sel_ide.js 拡張スクリプトをインストールする。

ほとんどのテスターは、テストスクリプトをプログラミング言語ファイルにエクスポートし、Selenium-RC API を利用する方法を選択することになるでしょう (Selenium-RC API については、Selenium-RC に関する章を参照)。ただし、組織によっては、可能な限りテストスクリプトを Selenium-IDE から実行した方が都合がよい場合もあります (テストの実行を多数の契約社員に担当させている組織や、十分なプログラミングスキルを期待できないケースなど)。このような場合には、JavaScript コードの断片を利用する方法か、goto_sel_ide.js 拡張スクリプトを使う方法を検討するとよいでしょう。

store コマンド群と Selenium 変数

Selenium 変数を使うと、スクリプトの冒頭で定数を格納することができます。また、データ駆動型テスト設計と組み合わせて使う場合には (あとのセクションで取り上げます)、コマンドライン、ほかのプログラム、またはファイルからテストプログラムに渡す値を Selenium 変数に格納することができます。

プレーンな store コマンドは、たくさんある store コマンド群の中で最も基本的なコマンドで、Selenium 変数に単純に定数値を格納するのに使用できます。store コマンドは、変数に格納するテキスト値と Selenium 変数の 2 つのパラメータを取ります。変数の名前を付けるときは、英数文字だけを使う標準的な命名規則に従ってください。

コマンド 対象
store paul@mysite.org userName

上のように記述すると、スクリプトのあとの方で、変数に格納された値を利用できます。変数の値にアクセスするには、次に示すように、変数をブレース ({}) で囲み、先頭にドル記号を付けます。

コマンド 対象
verifyText //div/p ${userName}

変数の一般的な使い方の 1 つに、入力フィールドへの入力を格納する操作があります。

コマンド 対象
type id=login ${userName}

Selenium 変数は、最初のパラメータにも 2 番目のパラメータにも使用することができます。コマンドのパラメータに変数が使われている場合、変数は、このコマンドが実行するほかのあらゆる操作に先立って Selenium によって解釈されます。Selenium 変数をロケータ表現の内部で使うこともできます。

verify および assert コマンドのそれぞれに対し、対応する store コマンドが存在します。これらのコマンドのうち、よく使われるものを以下に示します。

storeElementPresent

storeElementPresent は、verifyElementPresent に対応するコマンドです。このコマンドは、UI 要素が見つかったかどうかに応じて、ブール値 (“true” または “false” のいずれか) を格納します。

storeText

StoreText は、verifyText に対応するコマンドです。このコマンドはロケータを使ってページ上の特定のテキストを探します。テキストが見つかった場合には、そのテキストが変数に格納されます。storeText を使うと、テスト対象のページからテキストを抽出することができます。

storeEval

storeEval の最初のパラメータにはスクリプトを指定します。JavaScript を Selenese に埋め込む方法については、次のセクションで取り上げます。テストの中で storeEval を使うと、スクリプトの実行結果を変数に格納することができます。

JavaScript と Selenese パラメータ

JavaScript は、 スクリプト と非スクリプト (一般には式) の 2 つの種類の Selenese パラメータで使用できます。ほとんどの場合は、Selenese パラメータに指定された JavaScript コードの断片の中で、テストケース変数にアクセスしたり操作したりすることが多いでしょう。テストケース内で作成されたすべての変数は、JavaScript の 連想配列 に格納されます。連想配列とは、連番の添字ではなく、文字列を添字にもつ配列のことです。作成したテストケースの変数が格納される連想配列には、 storedVars という名前が付けられます。JavaScript コードの断片で変数にアクセスしたり操作したりするには、必ず storedVars[‘変数名’] の形で参照する必要があります。

スクリプトパラメータでの JavaScript の使用

いくつかの Selenese コマンド、たとえば assertEvalverifyEvalstoreEvalwaitForEval などのコマンドでは、 スクリプト パラメータを指定します。これらのパラメータでは特別な構文は必要ありません。Selenium-IDE ユーザーなら、JavaScript コードの断片の適切なフィールドを入力するだけです (通常、入力先のフィールドは [対象] フィールドです。 スクリプト パラメータは一般に、最初のパラメータか唯一のパラメータのいずれかだからです) 。

次に示すのは、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’].toLowerCase() lc

非スクリプトパラメータでの JavaScript の使用

コマンドが取るパラメータの種類が スクリプト ではない場合でも、パラメータに使う値を JavaScript を使って生成することができます。ただし、この場合には特別な構文が必要になり、JavaScript コードの断片をブレースで囲み、その前にラベル javascript を付ける必要があります。具体的には、 javascript {*ここにコードを記述*} のように指定します。次に示すのは、 type コマンドの 2 番目のパラメータ value を、特別な構文を使って JavaScript コードから生成する例です。

コマンド 対象
store league of nations searchString
type q javascript{storedVars[‘searchString’].toUpperCase()}

echo - Selenese の Print コマンド

Selenese には、テスト出力にテキストを書き込むことができる簡単なコマンドが用意されています。このコマンドを使うと、テストの実行中に進捗状況を示す情報をコンソールに表示できるので便利です。これらの情報を使えば、テスト結果のレポートに実行時の状況を埋め込むこともできるので、テストで問題が見つかったときに、ページ上のどこにバグがあるのか探すのに役立ちます。また、echo 文を使うと、Selenium 変数の内容を出力できます。次に例を示します。

コマンド 対象
echo Testing page footer now.  
echo Username is ${userName}  

警告、ポップアップ、および複数のウィンドウ

このセクションは未完成です。