アイフラッグラボ
iFLAG Labs is a technical information site which iFLAG offers.
iFLAG Labs provides you with the opportunity to experience and evaluate new and emerging innovations, technologies, and service from iFLAG.

トップページ»  SeleniumIDE導入Tips»  SeleniumIDEのループ処理

Selenium IDE でループ処理(n回ループ)を行う

 

皆さんこんにちは。アイフラッグの品質管理チームKです。
Selenium IDEでループ処理をやりたいけど、ループ回数を指定する方法しか見つかりませんでした。
例えばブログ記事の「削除」ボタンを記事の回数分だけクリックしたい場合など、ループ回数が特定ではない場合はちょっと困りますね。
そこで今回は、テスト処理をn回ループする方法をご紹介します。

エクステンションのインストール

今回のループ処理で使用するコマンドは、Selenium IDEデフォルト機能にはありません。Selenium IDEに備わっている拡張機能(ユーザー拡張スクリプト)をインストールして、ループコマンドが使える状態にしたいと思います。

まずはSelenium IDEを起動します(ctrl + alt + s)

Selenium IDE画面左上の「オプション」>「設定」をクリックすると設定画面が表示されます。こちらの「一般」タブにある「Selenium Core拡張スクリプト(user-extensions.js)」枠に、ユーザー拡張スクリプト(javascriptファイルですね)のパスを設定してSelenium IDEを再起動すると有効になります。

Selenium IDE Options

インストールするエクステンションは、以下のブログに記載されているものを使用します。
Selenium IDE Flow Control - Goto and While Loops
URL:http://51elliot.blogspot.jp/2008/02/selenium-ide-goto.html
ダウンロード先
https://github.com/darrenderidder/sideflow/archive/master.zip

使用するのはZipファイル内の「sideflow.js」です。これを任意のフォルダに保存し、先ほどのSelenium Core拡張スクリプト 枠にパスを入力します。
Selenium IDEを再起動すると、(分かりにくいですが)今まで使えなかった新しいコマンドがいくつか使えるようになっていると思います。

  • while
  • endWhile
  • gotoIf
  • gotoLabel

など

テストケースの作成

これらの拡張コマンドを使用して、早速テストケースを作成したいと思います。例としてCMSで作成した(何ページあるかわからない)ページを全部削除するケースを作ります。

作成したページの削除
open /page/pagelist  
store 1 dummy
while storedVars['dummy'] == '1'  
click id=pageDelete  
click id=confirmDelete  
waitForTextPresent ページを削除しました。  
gotoIf selenium.page().getCurrentWindow().document.getElementsByName('pageDelete').length == 0 endOfTestCase
endWhile    
label endOfTestCase  

最初から解説していきます。

open /page/pagelist  

まず対象のページを開きます。open コマンドで、BaseURL配下のパスを記述します。
openコマンドは該当ページの読み込みが完了したら次へ進みます。

store dummy 1

storeコマンドを使用して、whileループの条件に使う変数を設定します。ここでは変数名=dummy、値=1 にしていますが、それ以外でも今回は大丈夫です。

while storedVars['dummy'] == '1'  

先ほどインストールした拡張スクリプトによって使用可能となった「while」コマンドを使用します。
評価条件は2列目のテーブルに入っているstoredVars['dummy'] == '1' です。
storedVars['dummy'] は、storeコマンドで変数化した値を取り出すときに使います。以前紹介した${dummy}と同じ意味です。
2列目の評価条件がtrueの時、後で紹介する「endWhile」コマンドまでのテスト処理を順次実行します。評価がfalseになったらループを抜け出し、「endWhile」以下のテストに進みます。

click id=pageDelete  
click id=confirmDelete  
waitForTextPresent ページを削除しました。  

この3つの行で、①ページの削除ボタンをクリック、②削除確認ボタンのクリック、③削除完了メッセージの確認
を実行しています。この部分はテスト対象によって様々ですね。

gotoIf selenium.page().getCurrentWindow().document.getElementsByName('pageDelete').length == 0 endOfTestCase

「gotoIf」コマンドも同じく拡張スクリプトで使用可能になったコマンドです。
2列目の評価条件を評価し、trueだったら後から紹介する「label」コマンドまでジャンプします。3列目の値に入っている「endOfTestCase」がlabel名です。
言葉で書くと、ページ削除ボタン(input name="pageDelete")がひとつもなかったら、endOfTestCase というラベル名のついたlabelコマンドまでジャンプする、という処理を行っています。
※2列目の評価条件については、次回解説したいと思います。

endWhile    

上に出てきた「while」コマンドと対をなすコマンドです。while ~ endWhile に囲まれた部分が、ループ処理されます。

label endOfTestCase  

こちらも上で出てきた「gotoIf」と対をなすコマンドです。2列目にlabel名を記載し、gotoIfコマンドの3列目と同じ名前になるように使います。

以上です。
一番のポイントは、whileループを常にtrueで返すことにより、ループを無限にしておくことです。
そのループ処理の中でgotoIfコマンドを呼び出し、ループを抜ける条件を記述します。条件が満たされたら、ループの外側のlabelコマンドに向かってジャンプします。
今回のサンプルはループ内処理を一度実行してから、「gotoIf」コマンドでループを抜ける条件を評価していますが、先にループを抜ける条件を評価したい場合は「gotoIf」コマンドを「while」コマンドの直下に移動するだけで大丈夫です。

この手法はテストケースとして使う以外にも、延々続きそうな手作業を軽減するツール、としても使えると思います。
皆様のお役に立てば幸いです。
ありがとうございました。

2013/04/12


 

Selenium IDE Flow Controlを使用してforeachループを実行

皆さんこんにちは。アイフラッグの品質管理チームKです。
ループ処理ネタの第2弾です。

前回は「Selenium IDEのエクステンションを使用して、n回ループする」処理を解説しました。ループ回数が一定ではない場合に、特定の評価条件になるまでループを継続してくれます。
今回は投入するデータがあらかじめ分かっており、投入したデータ分だけループ処理を行うテストをやってみたいと思います。

使用するエクステンションは、前回と同じく以下を使用します。
Selenium IDE Flow Control - Goto and While Loops
ダウンロード先
https://github.com/darrenderidder/sideflow

また分かりやすいように、設定した変数をSelenium IDE画面上で確認できるアドオンもインストールしておきます。
https://addons.mozilla.org/en-US/firefox/addon/stored-variables-viewer-seleni/
このアドオンをインストールすると、storeやstoreEvalなどのコマンドで保存した変数の値を確認する事が出来ます。

ではさっそくテストケースを作成していきます。テスト内容は、「複数のログインID、パスワードをあらかじめ保存し、それらを使用してシステムにログイン可能かテストする」というものです。
まずはログインID、パスワードのデータを設定します。

getEval delete storedVars['userID']  
getEval delete storedVars['userPW']  
push account1 userID
push testpass userPW
push account2 userID
push testpass2 userPW
push account3 userID
push testpass3 userPW

細かく見ていきます。
最初の2行は、変数として使用する文字列をクリアします。

getEval delete storedVars['userID']  
getEval delete storedVars['userPW']  

次の行からは、エクステンションに入っている「push」というコマンドを使用して、各変数に配列としてデータを持たせます。
変数名は重複してかまいません。上の行から順番に保存されていきます。

push 登録したいデータ 変数名

データ設定のテストケースが出来上がったらテストを実行します。先ほどインストールしたアドオンで変数を確認すると、以下のように表示されました。

次に設定されたデータを使って、ログインできるか確認するテストケースを作成します。

storeEval storedVars['userID'].length x
echo ${x}  
store 0 i
while ${i} < ${x}  
open /login.php  
storeEval storedVars['userID'][storedVars['i']] nowID
echo ${nowID}  
storeEval storedVars['userPW'][storedVars['i']] nowPW
echo ${nowPW}  
type name=loginid ${nowID}
type name=loginpw ${nowPW}
clickAndWait name=submit  
assertTextPresent こんにちは。${nowID}さん。  
clickAndWait id=logout  
assertTextPresent ログアウトしました。  
storeEval parseInt(storedVars['i']) +1 i
echo ${i}  
endWhile    

少し長いですが、上から解説して行きます。
まず1、2行目では、ログインIDが何個設定されたかチェックしています。storedVars['userID'].length は変数に設定された配列の個数を返しますので、その値を「x」として保存しました。
2行目の「echo」コマンドはデバッグ用にログに値を吐き出します(実稼動する際はechoコマンドは不要です)。

storeEval storedVars['userID'].length x
echo ${x}  

3行目のコマンドは、以前ご説明したwhileループで使用するカウンタです。

store 0 i

続いてwhileコマンドを使用して、ループをスタートさせます。終了条件は「ログインIDの個数分」と言うことにしますので、1行目で設定した${x}以下になるようにします。

while ${i} < ${x}  

ループが始まった後に5行目でテストするページを開きます。
6~9行目は、配列から値を取り出します。一般的に配列から値を取り出す場合は、配列名[0]、配列名[1]、配列名[2]のように記述するケースが多いと思いますが、Selenium IDEでも同じようにして取得する事が可能です。
ループ処理なので、配列名[0]の数字部分はループカウンタの数字を当て込んでいきます。

storeEval storedVars['userID'][storedVars['i']] nowID
echo ${nowID}  
storeEval storedVars['userPW'][storedVars['i']] nowPW
echo ${nowPW}  

storedVars['userID'][storedVars['i']] ⇒userID[0]
storedVars['userPW'][storedVars['i']] ⇒userPW[0]
と展開されました。
抽出した配列データをさらに別の変数(${nowID}、${nowPW})に入れます(実際には省略可能だと思います)。

10行目~15行目にかけては、抽出したログインID、パスワードを使用してログインし、正常にログインできたことを確認してログアウトしています。

16、17行目でループカウンタをカウントアップしています。
storedVars['i'] +1 でカウントアップしたいところですが、storedVars['i']が数値ではなく文字列として認識されてしまい
1 + 1 =2 となるところが 1 + 1 = 11と文字列結合されるのを防ぐため、数値型と認識させるparseInt()で囲っています。

storeEval parseInt(storedVars['i']) +1 i
echo ${i}  

Selenium IDEの変数表示部分でも、ループカウンタが 0⇒1へ変更された事が分かります。

最後の行にendWhileコマンドを仕込んで、(なんちゃって)foreachループの完成です。

今回に限らず、データを設定するテストケース、設定されたデータを元にテストを実行するテストケース、と分けておくととても便利ですね。
ここまでご説明して何ですが、firefoxにインストールするタイプのアドオン「Selblocks」の方がいろいろ出来そうな気がしています(笑)。
https://addons.mozilla.org/en-US/firefox/addon/selenium-ide-sel-blocks/versions/
機会がありましたらこちらのアドオンも使ってみたいと思います。
 

ありがとうございました。

2013/06/11


アイフラッグラボ(IFLAG Labs)とは

アイフラッグラボとは、アイフラッグが提供する技術情報サイトです。アイフラッグが提供するスモールビジネス向けのITサービスの開発実績から培った技術ノウハウを公開していきます。技術情報が皆さまのサポートになれば幸いです。