SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Selenium 0.7利用手順書

Selenium 0.7 TipsとExcelによるDB初期化

Seleniumによるテストの効率を上げるテクニック

  • X ポスト
  • このエントリーをはてなブックマークに追加

テストケースの書き方 Tips集(2/2)

画面のJSP/HTMLソースでidを付与する

 Seleniumを使用する際、操作する対象を特定する必要があります。Seleniumでは対象を特定するためのElementLocatorとしてDOMやxpathなどさまざまな方法が提供されていますが、id属性で指定するのが一番簡単かつ確実です。従って、画面のJSPやHTMLソースを記述する際にあらかじめid属性を付与することを推奨します。特に、以下の要素については画面のソース上でid属性を付与することを推奨します。

表3 画面のソース上でのid属性付与を推奨する要素
画面の要素使用するコマンド付与推奨の属性
tableverifyTableid属性

 table要素については、IEを使用する場合はid属性ではなく、name属性でもverifyTableコマンドを使用することができます。しかし、Firefoxを使用する場合は、name属性だとエラーになってしまうので、id属性を使用した方が良いでしょう。

コンボボックス(select要素)の検証

 コンボボックスなどselect要素を指定するにはselectコマンドを使いますが、select要素の検証にはassertSelectedコマンドやassertSelectOptionsコマンド、assertSelectedOptionsコマンドを使用します。

 これらの違いは次のとおりです。

コマンド名説明
assertSelectOptionsリストの一覧の検証
assertSelectedリストで何が選ばれているかの検証
assertSelectedOptionsリストで何が選ばれているかの検証(複数選択の場合)

 assertSelectedOptionsコマンドは、Seleniumバージョン0.7.0で追加されたコマンドです。コマンド書式や記述例は「Selenium 0.7 リファレンスガイド(日本語版)」を参照してください。

リンク先(href属性)の検証方法

 Seleniumの仕様では、セキュリティ上の理由(クロスサイトスクリプティング対策)から外部サーバのURLを開くことができません。従って、外部へのリンク先に対する検証は、clickコマンドでURLを開いてassertTitleするという手段が使えません。

 そこで、assetAttributeコマンドを使用してリンクのhref属性に対する検証を実施することができます。例えば、書籍の情報を表示する画面で、Amazonへのリンクがあったとします。

書籍情報画面のHTMLソース
<td rowspan="16" valign="top" class="book_detail_image">
  <!--ここは書籍のISBNを元にアマゾンから画像を持ってくる-->
  <a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774123412/"
     target="_blank">
  <img src="http://images-jp.amazon.com/images/P/4774123412.09.MZZZZZZZ.jpg"
border="0"></a>

画像をクリックするとAmazonのページが別ウィンドウで開きます。
</td>
<td class="menu_book_detail"> 書籍ID: </td>
<td class="content_book_detail"> 3 </td>

 このリンク先に対するSeleniumのテストケースの書式は次のとおりです。

BookInfo_TestCase.html
<tr>
    <td>assertAttribute</td>
    <td>xpath=//a@href</td>  …【1】
    <td>exact:http://www.amazon.co.jp/exec/obidos/ASIN/4774123412/</td>  …【2】
</tr>
    【1】xpathでa要素のhref属性を指定。
    【2】文字列マッチングのexact:プリフィックスを付ける。

 ポイントは、http://の先頭にexact:という文字列マッチングのprefixを付与することです。exact:を付けないと、「cannot find PatternMatcher.strategies.http」というエラーが発生します。

リンクの文字列で対象のa要素を指定する
 ページにa要素が複数ある場合、ターゲットを以下のようにすることでリンクの文字列で指定をすることが可能です。
xpath=//a[text()='リンク文字列']@href

 なお、画面のソース上で、リンク先を相対パスで書いていた場合は注意が必要です。

ログイン画面のHTMLソース
<form name="BlankForm" method="post" action="/MyApp/generalLogin.do">
  <input type="submit" name="submit" value="一般ユーザーログイン">
</form>
<a href="026_guide.jsp">ご利用ガイド</a>  …【1】
    【1】href属性の記述が相対パスになっている。

 href属性を相対パスで指定した場合、assertAttributeコマンドに対する動作がIEとFirefoxで異なります。

IEの場合

 画面のソース上、href属性の記述は026_guide.jspだけですが、リンク先として使用される属性にはホスト・ポート・コンテキストパスを含めた絶対パスになっています。例えば、"http://localhost:8080/MyApp/026_guide.jsp"です。つまり、テストケースの方でも絶対パスで記述する必要があります。ホスト(IPアドレス)も記述する必要があるため、テストを実施するサーバを変更した際にテストケースの記述も変更しなければならないので要注意です。なお、このような場合に、「実行するURL(IPアドレス)を変更できるようにする」で紹介した変数設定が有用です。

 テストケースの記述は次のようになります。

Login_TestCase_IE.html
<tr>
    <td>assertAttribute</td>
    <td>xpath=//a@href</td>
    <td>exact:http://localhost:8080/MyApp/026_guide.jsp</td>  …【1】
</tr>
    【1】attributeとしてブラウザが認識しているのは絶対パス。http://で始まるのでexact:プリフィクスも付ける。

FireFoxの場合

 Firefoxの場合は、assertAttributeコマンドで取得できるhref属性の内容は、画面のソース上に記述された通りになります。つまり上記の例で言うと"026_guide.jsp"だけとなります。

 テストケースの記述は次のようになります。

Login_TestCase_FF.html
<tr>
    <td>assertAttribute</td>
    <td>xpath=//a@href</td>
    <td>026_guide.jsp</td>  …【1】
</tr>
    【1】画面ソースの記述そのまま。

 後は、厳密ではなくなってしまうのですが、パターンマッチングを行う部分にワイルドカード(*)を使用するという方法もあります。この場合、IEでもFirefoxでもエラーを発生させずに動作させることが可能です。

Login_TestCase_Wildcard.html
<tr>
    <td>assertAttribute</td>
    <td>xpath=//a@href</td>
    <td>*026_guide.jsp</td>  …【1】
</tr>
    【1】ワイルドカード(*)を使用。

同じ表示のリンクが複数ある場合のクリック(指定)方法

 例えば、同じタイトルの書籍で、書籍IDが異なっているような場合です。

図4 表示が同じリンクの例
図4 表示が同じリンクの例

 この画面のHTMLソースは次のようになっています。

画面のHTMLソース
<td class="search_result_content">
    <a href="/MyApp/dispBook.do?bookId=4">JUnitインアクション</a>
</td>
…(中略)…
<td class="search_result_content">
    <a href="/MyApp/dispBook.do?bookId=5">JUnitインアクション</a>  …【1】
</td>
    【1】bookIdが異なる。表示は同じ。

 通常、リンクをクリックするには次のように、リンクとして表示されている文字列を指定をします。

Seleniumのテストケース(link表示指定)
<tr>
    <td>clickAndWait </td>
    <td>link=JUnitインアクション</td>
    <td></td>
</tr>

 上記の指定をした場合、Seleniumは一番最初にマッチしたものをクリックします。従って、上記の例では常に1番目(bookId=4)の書籍をクリックすることになってしまいます。このような場合、xpathを使用することによって、表示される文字列ではなくhref属性を指定してクリックすることができます。

 Seleniumのテストケースhtmlは次のようになります。

Seleniumのテストケース(xpath指定)
<tr>
    <td>clickAndWait </td>
    <td>xpath=//a[@href='http://localhost:8080/MyApp/dispBook.do?bookId=5']</td>
    <td></td>
</tr>

 href属性のソース上の記述は相対パスですが、実際に使用される値はIEでは絶対パスなので上記のように記述が長くなってしまいます。そこで、xpathの文字列関数containsを使用して特定の文字列を含んだhref属性を指定することができます。href属性に"bookId=5"を含むa要素を指定する場合は次のようになります。

Seleniumのテストケース(xpath指定、contains使用)
<tr>
    <td>clickAndWait </td>
    <td>xpath=//a[contains(@href,'bookId=5')]</td>
    <td></td>
</tr>

 containsを使用して記述することで以下のメリットがあります。

  • テストケースに記述する量を少なくできる(それによってミスを少なくできる)。
  • ブラウザによってリンクに対するパスの取得方法が違う(IE=絶対パス、Firefox=ソースの記述通り)が、その差を考慮する必要なしに両者で動作させることができる。

同じ表示が複数あることを検証するコマンド

 Seleniumで表示された文字列を検証するコマンドがassertTextPresentですが、assertTextPresentは同じ表示が複数あった場合、その表示がいくつあったのかは分かりません。そこで表示された文字列の回数を検証するコマンドを作成しました。このコマンドはSeleniumの開発コミュニティに寄贈されています。

assertTextPresentCount

 指定したテキスト文字列の表示回数を検証します。

書式
コマンドターゲットバリュー
assertTextPresentCount検証する文字列(表示される文字列)表示されている回数
verifyTextPresentCount検証する文字列(表示される文字列)表示されている回数
実行例
コマンドターゲットバリュー
verifyTextPresentCountYou are now logged in.1
assertTextPresentCounterror!2
assertTextPresentCountYou are now logged in.0

 バリューには指定した文字列の表示回数を設定します。バリューが1であれば、assertTextPresentと同様の動作、バリューが0であればassertTextNotPresentと同様の動作ということになります。

 このコマンドを使用するためには、「user-extensions.js」に以下のコードを追記します。

user-extensions.js
/*
 * assertTextPresentCount verify that the specified text is present
 * with specified counts in the page content.
 */
Selenium.prototype.assertTextPresentCount = function(expectedText, count) {

    var allText = this.page().bodyText();
    var pattern = new RegExp(expectedText,"g");

    LOG.debug("expect text =" + expectedText);
    LOG.debug("expect count=" + count);
    LOG.debug("matchingText=" + allText.match(pattern));

    if(allText == "") {
        Assert.fail("Page text not found");

    } else if(allText.indexOf(expectedText) == -1) {
        if (count != 0) {
        Assert.fail("'" + expectedText + "' count doesn't match.");
        }
    } else if(allText.match(pattern).length != count) {
        Assert.fail("'" + expectedText + "' count doesn't match.");
    }
};

ボタン2度押しコマンド

 セキュリティ対応の1つとして、[submit]ボタンの2度押し対策がよく問われます。このボタン2度押しを簡単に実行するコマンドを作成しました。

clickTwice

 使用方法はclickコマンドと同様です。このコマンドを使用するためには、「user-extensions.js」に以下のコードを追記します。

/*
 * Click Twice on the located element, and attach a callback to notify
 * when the page is reloaded.
 */
Selenium.prototype.doClickTwice = function(locator) {
    var element = this.page().findElement(locator);
    this.page().clickElement(element);
    this.page().clickElement(element);
};

 実は、このコマンドを使用しなくても、clickコマンド+clickAndWaitコマンドを続けて実行することでボタン2度押しを実現することができます。clickTwiceコマンドを使用した場合のメリットは、「ボタン2度押しである」ことが明示できることと、実施速度が10数msec速くなることです。

テストケースの書き直し

 Seleniumの良い点は、回帰テストが容易に実行できることです。バグ発生時に、修正箇所だけでなく全項目をリグレッションとして容易に再試験することができます。ただし、テストケースの書き直しが発生する場合もあります。画面のJSP/HTMLソースを修正した場合と、アプリケーションの業務ロジックを修正した場合の、テストケースの修正要否は次のようになります。

表4 テストケースの修正要否
画面の修正ロジックの修正テストケースの修正要否
修正なし修正なし修正不要
修正あり修正なし修正不要。assertTableで順番が変わる場合は修正必要。
修正なし修正あり修正必要。画面への出力内容が変わらない場合は修正不要。
修正あり修正あり修正必要

 画面のレイアウト、例えばボタンの位置を変更したとしてもテストケースの修正は必要ありません。そのまま回帰テストを実行することができます。

 ロジックを修正していなくても、assertTableを使用しているときに修正が必要となることがあります。例えば、書籍の情報を表示している画面で著者名と出版社名の表示順序を変更する場合、著者名をassertTableを用いて検証しているテストケースでは修正が必要となります。assetTableではなく、assertTextPresentを使用して「著者名:○○○」という検証をしているテストケースでは修正が不要です。

 画面のソースを修正しなくてもロジックを変更した場合は、基本的に修正が必要です。例えば、検索の条件を変更した場合、検索結果が変わることになるテストケースにおいて検索結果件数をassertTextPresent検証している場合、テストケースの修正が必要です。

 assetTextPresentassetTableの使い分けの指針は次のとおりです。

  • assertTextPresent
  • 画面上1箇所しか表示されない場合。表示の順序などはあまり関係なく、表示内容を検証したい場合。
  • assetTable
  • 表示されている場所、順序を検証したい場合。画面上同じ文字列が複数表示される場合。

次のページ
Excelを使ったDB初期化

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Selenium 0.7利用手順書連載記事一覧

もっと読む

この記事の著者

大田尾 一作(株式会社DTS)(オオタオ イサク)

株式会社DTS イノベーション推進部在籍。業務内容は、FintechやIoT、AIといった新しい領域でのビジネスを推進するための調査・研究。日本Seleniumユーザーコミュニティに参加。   

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/437 2006/08/18 00:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング