2014年10月23日木曜日

IDEのコメント入力はログに出力しない-echoコマンドを使います

Selenium IDEに[コメントを挿入]とあるが、このコメントはログに出力しないので、
ログに出力したいコメントは、echoコマンドを使ってください


コメントを入力したい箇所で、右クリックメニューを表示し、[コメントを挿入]を選択


コメント入力行が選択行の上に入るので、そこでコメントを入力


このSeleniumスクリプトを実行すると、コメントはログタブに出力していないことが分かります
コメントをログに出力したい場合は、echoコマンドを使ってください




2014年10月20日月曜日

Javascriptを知っていれば、結構、記述できます

Javascriptを知っていて、storeExpressionコマンドとstoreEvalコマンドを活用すると結構、記述できます

例えば、下の[個人アドレス帳 - すべて]からAグループ、Bグループ、Cグループを削除したい場合、


フロー制御で1つずつ指定して[グループの削除]をクリックする時、
どうやって各グループを指定しようか?と考えます
そこで、
storeExpressionコマンドで対象にするグループ名を取得します

storeExpression  javascript
            { selenium.getText( "//div[@id='dtree-adrTree']/div[@class='clip']/div["
                          + storedVars['no']
                          + "]" ) 
            }
            w
変数wに変数noの示す文字列を取得します
これを使用して、削除対象にする要素のindexを得ます

削除対象のindexを使って、グループ削除を指定するために右クリックメニューを表示します
storeEvalコマンドを使って、contextMenuAtコマンドのlocatorを作成します

storeEval  javascript
        { var s = "//div[@id='dtree-adrTree']/div[@class='clip']/div["
              + storedVars['no']
              + "]";
          storedVars['w'] = s; 
        }
        f
これで、
  contextMenuAt  ${w}  80,120
を実行します
実際のコードは、
  contextMenuAt //div[@id='dtree-adrTree']/div[@class='clip']/div[2]  80,120
を実行しています



storeEvalコマンドを実行すると、ログに
  script is: //div[@id='dtree-adrTree']/div[@class='clip']/div[1] 
を出力します

2014年10月9日木曜日

IDEを他のブラウザで動作させる

Selenium IDEをChromeやIEで動作せることが、一応、できます
一応というのは、多少の制約があります

まずは、動作の手順を...

Step1.SeleniumIDEのオプションで、WebDriver使用を設定しておきます

 SeleniumIDEのメニューからオプションウィンドウのWebDriverタブで設定します

 Enable WebDriver Playbackにチェックを入れ、ブラウザを指定します



Step2.Selenium ServerとWebDriverをコマンドラインから起動します

IEの場合
java -jar selenium-server-standalone-2.43.0.jar -Dwebdriver.ie.driver=.\IEDriverServer.exe

Chromeの場合
java -jar selenium-server-standalone-2.43.0.jar -Dwebdriver.chrome.driver=.\chromedriver.exe

例.Chrome指定で起動すると下のようにメッセージを出力してSeleniumIDEの実行を待ちます





























Step3.SeleniumIDEでテストケースを実行します

例えば、

実行すると、



多少の制約とは...

  1. テストケース毎にブラウザを起動しますので、直前のテスト結果を利用してのテストを行いにくくなります
     テストケース毎に起動するブラウザは、closeコマンドで終了させることができます
  2. 画面キャプチャ captureEntirePageScreenshotコマンドはエラーになります
     JavaSrciptを記述できるので画面キャプチャできる実行ファイル(.exeとか)を作成して呼び出すような対処をすると良いかなと思います
  3. 実行前にSeleniumコマンドを修正・追加などを行うことはできますが、実行した後にSeleniumコマンドを修正・追加して実行はできません
     一度、終了してから実行するようになります

あと、気になるとしたら...
  1. 変数はテストケースを越えて使用できます
  2. ログファイルへの出力はFireFoxと同じ様にできます


2014年10月7日火曜日

classに含まれている要素を調べる - ロケーション指定

太字になっているとか、スターが付いているとか付いていないとかを知るには、セレクタcontainsで要素がclass指定に含まれているか調べます

例えば、テストメール14が、未読の場合は太字になっています



ページは
<div style="min-width: 776px;" id="msg-123" class="ui-ll clickable ll-even unseen">
と記述しています
classの.ui-ll.unseenが太字になります

エラーメッセージを出力したいので、storeElementPresentコマンドを使いました
storeElementPresent xpath=//div[@id='lbxdata']/div[1][contains(@class,'unseen')] flg

太字(未読)であれば、変数flgにtrue, 既読であればfalseをセットします


2014年10月3日金曜日

配列で扱いたいとき

メニュー項目の確認では、配列で扱いたいときがあります

例えば、移動メニューでは下の様に配列のindexを使って指定します

[1]の項目は、[1]をつけなくても[1]と扱われます



mouseDownの後にmouseUpしないと

チェックボックスにチェックすることでメールを選択するために mouseDownコマンドを使用しました
mouseDownだけでは下の様になります



このままにしたくない場合は、mouseUpコマンドを実行します

2014年10月2日木曜日

ドラッグ&ドロップで移動するとき

メール一覧から、選択したメールをアーカイブフォルダに移動するときのSeleniumコマンドを下の手順で実行します

 ドラッグ&ドロップは、dragAndDropToObjectコマンドを使います

 ただし、対象は選択しておく必要があるようです


 *ブラウザの実行を待つために、pauseコマンドは必要です

チェックボックスをclickできない場合

チェックボックスへのチェックのON/OFFは、check/uncheckコマンドやclickコマンドを使用するが、
エラーにはならないが、チェックできない場合があったので、mouseDownコマンドを使用しました

  mouseDown //div[@id='lbxdata']/div/div/span[@name='checker']





2014年9月30日火曜日

コンテキストメニューの操作 ( contextMenu / contextMenuAt )

コンテキストメニューを指定したい場合、contextMenu / contextMenuAtコマンドを使います

例えば、受信箱のコンテキストメニューを指定したい場合、

  contextMenu //div[@id='dtree-mbxTree']/div[2]/div[1] 

を実行すると下の様にコンテキストメニューを表示します




ここで、例えば「フォルダを空にする」をクリックして実行します
    
  click //div[@id='popupmenu']/div[5]/span[2]


上の図のようにコンテキストメニューをウィンドウの左端上に表示します
これは、contextMenuAtコマンドで任意の位置に表示できます

例えば、

 contextMenuAt //div[@id='dtree-mbxTree']/div[2]/div[1] 80,120

と指定すると下の位置に表示します




2014年9月18日木曜日

チェックボックスをクリックする

一覧表示している項目のチェックボックスをクリックしたいとき

例えば、受信箱の一覧表示しているメールの1つで・・・

SeleniumIDEでは、

先頭にフォーカスを当てる場合、focusコマンド、keyコマンドとshiftKeyDown/shiftKeyUpコマンドを組み合わるとチェックONにできます


         ↓

 keyDownコマンドの\32は、スペースキーを押下しています

         ↓



マルチブラウザ対応では、
 
FireFoxではOKでしたが、IEとChromeではNGとなったので、変換コードを下の様に変更しました

if( param.browsertype.equalsIgnoreCase(Consts.TYPEFX) )
{
//FireFoxでは、変換コードそのまま
selenium.focus("//div[@id='lbxdata']");
selenium.shiftKeyDown();
selenium.keyDown("//div[@id='lbxdata']", "\\32");
selenium.shiftKeyUp();
}
else
{
//IEとChromeでは、チェックボックスがOFFの場合にクリックするようにしています
if( !selenium.isElementPresent("xpath=//div[@id='lbxdata']//div[@class='ui-ll clickable ll-even recent ll-selected']") )
{
selenium.click("xpath=//div[@id='lbxdata']//div//div//span");
}
}


2014年9月17日水曜日

selectPopUpコマンド- storeAllWindowTitlesコマンド

メインウィンドウからメール作成ウィンドウを表示すると、Seleniumの方でターゲットウィンドウを自動的に認識しないので、selectPopUpコマンドを実行しています

selectPopUpコマンドで、windowIDを指定します
windowIDが分からないときは、ウィンドウのタイトルを指定できます

例えば、メール作成ウィンドウのタイトルが「メールの作成」の場合

  selectPopUp  メールの作成


 ウィンドウのタイトルは、storeAllWindowTitlesコマンドで取得できます
このコマンドでターゲットウィンドウのタイトルを確認します

メールの作成ウィンドウを表示した後にstoreAllWindowTitlesコマンドを実行すると

  xgate4: 受信箱,メールの作成

のように、「,」カンマ区切りで変数にセットします

ウィンドウの切り替え - selectPopUp - selectWindow


メインウィンドウからポップアップウィンドウ、ポップアップウィンドウからメインウィンドウに戻る場合には、SeleniumAPIは自動で対象ウィンドウを認識しないので、selenium.selectWindow()、selenium.selectPopUp()をコールします

これらを呼び出した際には、ページロードを行うので、Thread.sleep()でページロードを待つようにしています

SELECTのOPTIONの確認-waitForSelectOptions

<select name="protocol">
 <option value="pop">POP </option>
 <option value="imap">IMAP </option>
</select>
のoptionタグの検証は、
 waitForSelectOptions  name=protocol  regexp:[POP,IMAP]
の様にしています

regexp: については、公式サイト 日本語版:テキストパターンの一致、英語版:Matching Text Patterns を参照してください


ブラウザの実行とSeleniumAPIとの実行時間差の対応

ブラウザ側の処理時間よりSeleniumAPIの方が速い為、SeleniumAPIの方でタイムアウトになる事があります

対処として、setTimeout APIでタイムアウト時間を変更します
デフォルトは30000 msecの設定です

例.
<textarea>に文字列を入力する場合、selenium.type()を実行します
検証として、最大文字数で入力したところ
FireFoxとChromeではデフォルトの実行でOKでしたが、IEではNGとなりました
FireFoxとChromeの文字列入力の様子とIEの文字列入力の様子を見ると、
IEの方が入力に時間がかかっていることが分かります
そこで、selenium.setTimeout()でタイムアウト時間を( 120000 )と設定したところ、IEも実行OKとなりました

※経験上、他の処理でもデフォルト時間ではNGになることが時々、発生したので、マルチブラウザ対応では120000msecに設定してテストするようにしています

pauseコマンド

pauseコマンドは、SeleniumIDEでもマルチブラウザ対応版でも、頻繁に使用しています

ブラウザ側での処理スピードとSeleniumIDEやJavaアプリケーションでの処理スピードに差があって、ブラウザ側の方が遅い為に調整で頻繁に入れています

主に入力コマンドの後、画面キャプチャの後、画面遷移で使用してます

SeleniumIDEで実行する時、遅く感じると思いますが、処理の時間差の対応なので、待ってくださいね

ブラウザによって取得テキストのスペースコードが違う?!

ブラウザによってSeleniumが取得するテキストが違う場合がありました

waitForTableコマンドのJavaへの変換コードは、FireFoxでは実行NGだが、IEではOKChromeNGとなりました

  説明の文字表現:□・・・全角スペース []・・・半角スペース \n・・・改行

SeleniumIDEで、
waitForTable (css=form[name="form_rcv"] > table.6.1, 自動で確認する[]1分間隔□[]3分間隔□[]5分間隔□[]10分間隔□[]15分間隔□[]20分間隔) 

と指定した場合のJavaへの変換コードは下の通り

for (int second = 0;; second++) {
  if (second >= 60) fail("timeout");
  try {
    if ("自動で確認する 1分間隔  3分間隔  5分間隔  10分間隔  15分間隔  20分間隔".equals(selenium.getTable("css=form[name=\"form_rcv\"] > table.6.1"))) break;
  } catch (Exception e) {}
  Thread.sleep(1000);
}

実行NGになったのは、スペースコードの違いでした

対処として、
検証対象の語句間が各ブラウザによって以下のように違う為、ブラウザ判定により検証テキストを指定しました。

検証テキストの内容

[FireFox]
 自動で確認する\n1分間隔\n3分間隔\n5分間隔\n10分間隔\n15分間隔\n20分間隔

[IE]
 自動で確認する[]1分間隔□[]3分間隔□[]5分間隔□[]10分間隔□[]15分間隔□[]20分間隔

[Chrome]
 自動で確認する[]\n[][][][][][][]1分間隔□\n[][][][][][][]3分間隔□\n[][][][][][][]5分間隔□\n[][][][][][][]10分間隔□\n[][][][][][][]15分間隔□\n[][][][][][][]20分間隔□

※どの場合でも上の様な文字列になるかは不明です。文字列を取得できるのに、エラーになる場合にスペースコードを調べてみると良いでしょう。

2014年9月16日火曜日

セレクトボックスで選択している項目を確認する - SELECTタグ

セレクトボックスで選択表示している項目を確認するとき、storeSelectedValueコマンドを使用して、選択項目を検証しました。

例えば、一覧リストの表示行数が25行になっていることを確認したい場合、



Seleniumコマンドソース


チェックボックスの確認

チェックボックスの確認は、waitForValue, storeValue などValueを検証するコマンドを使用します。


右ボタンメニューを利用すると便利です。

チェックが無い場合は、off  チェックのある場合は、on です。

動的に変化するメニューで・・・

例えば、タグの管理で、タグの登録が全くない場合、メニューの「タグ」をクリックで直ぐに「タグの管理」ウィンドウを表示しますが、



登録した場合、サブメニューを表示します。


サブメニュー表示の有無をstoreElementPresentコマンドで判定しました。
storeElementPresentコマンドは、存在の有無をtrue/falseで返します。
判定結果をアドオンのフロー制御を使用して次に移行するようにしました。

例えば、タグの全削除するSeleniumコマンドソースにて扱いを説明します。



[Enter]キーの確認

シンプルなサイトでは、Enterキーはキーコードを指定できます

keyPressコマンドを使用します

    keyPress  name=submit  \13

ただし、サイトのソースによっては効かない場合もあります
それは、またオイオイ・・・

アイコンの確認

例えば、メニューに表示しているアイコンの確認をする時



例えば、メニューの「作成」のアイコンで右クリックすると、右クリックメニューに[css=img.ui-sprite.sp-editmail]をwaitForText, storeForText・・・で検証するコマンド一覧が出力されるので、この中から選択します


ただし、右クリックメニューに独自にメニューを設定している場合は、インスペクタなどを使用して自分で要素を指定します。

例えば、フォルダ一覧の「受信箱」で右クリックすると、下の様に独自メニューがあるので、インスペクタで要素を調べて指定します。

インスペクタで調べて下のコマンドで検証しました。

waitForElementPresent xpath=//div[@id='nmbxTree_710']//span[@class='nodeLeaf leafWrap']//i[@class='leaf' and @style='background-image:url(../images/tr_inbox.png);']

2014年9月14日日曜日

マルチブラウザ対応版でFireFoxを起動できなくなった?!

マルチブラウザ対応で実行させようとしたら、FireFoxが起動しなくなった。
FireFoxを自動更新に設定にしていたので、使っていたSelenium Serverのバージョンが最新のFireFoxに対応できなくなったようです。
公式サイトから、最新版のselenium-server-standalone-2.43.0.jarをダウンロードしてJavaアプリケーション版の動作OK。

時々、こういうことがあるので、公式サイトを確認してください。

2014年9月11日木曜日

Selenium IDEでフロー制御したい場合

Seleniumコードを整理整頓しようとしたところ、フロー制御の拡張スクリプトの扱いが変更になっていました。
技術ブログ(2.SeleniumIDEの2.3. 拡張スクリプト)も更新しておきました。

フロー制御は Selenium IDE Flow Control - Goto and While Loops がシンプルで使いやすいので、使用させていただいています。
この拡張スクリプトは、FireFoxのアドオン対応となったので、FireFoxでhttps://addons.mozilla.org/ja/firefox/addon/flow-control/アドオンを追加してください。

2014年8月28日木曜日

スクリーンショット記録のタイミング

入力タグに何も入力せずにOKボタンを押すと、入力タグに「入力してください」といったメッセージを動的に表示します
この画面を記録するとき、「入力してください」メッセージを表示している間にスクリーンショットを記録するようにタイミングをとります
このタイミングは、個々によって違うので動作しながら調整します

IE11の場合

IEでテストを行う場合、IE使用に条件がある

https://code.google.com/p/selenium/wiki/InternetExplorerDriver のRequired Configurationを見ると

IE11でテストを行う場合、
インターネットオプションのセキュリティの保護モードを無効にする必要があります
無効にしないとエラーになります
  org.openqa.selenium.remote.SessionNotFoundException: Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones. Enable Protected Mode must be set to the same value (enabled or disabled) for all zones. (WARNING: The server did not provide any stacktrace information)...


他のバージョンにも条件がありますが、未確認なのでRequired Configurationを参照してください
確認したら投稿します

詳しくは、https://code.google.com/p/selenium/wiki/InternetExplorerDriver のRequired Configurationを参照してください

時々css指定できない

SeleniumIDEの右クリックで指定した css指定のlocator を変換したJavaコードで実行すると、時々、locator を認識できずエラーになる
こんなときは xpath指定でやってみる
これまでのところ、この対応でOK - FireFox, IE, Chrome

SeleniumIDE
waitForText css=div.formpad > table > tbody > tr > td  タグ名

変換コード
for (int second = 0;; second++) {
   if (second >= 60) fail("timeout");
    try { if ("タグ名".equals(selenium.getText("css=div.formpad > table > tbody > tr > td"))) break; } catch (Exception e) {}
    Thread.sleep(1000);
  }
css指定でエラーになるので
selenium.getText("xpath=//div[@class='formpad']//table//tbody//tr//td")

これはOK

なぜ、この要素だけ?と思うのだが、理由はわからない

waitFor系でエラーと決める場合は時間かかる

SeleniumコマンドのwaitFor系のJavaコードはエラーと決めるまで時間が掛かるようになっている

例えば

 SeleniumIDEで
   waitForText  id=dialog-caption  タグの管理

 のJavaコードは
   for (int second = 0;; second++) {
    if (second >= 60) fail("timeout");
     try { if ("タグの管理".equals(selenium.getText("id=dialog-caption"))) break; } catch (Exception e) {}
        Thread.sleep(1000);
   }

と変換しているのでエラーと決めるまで時間かかる

ブラウザの実行とプログラムの実行のスピードに差があるので、for文にしてThread.sleep(1000); で、要素がページに表示されるのを待っているのだと思う

ダイアログのまだ表示してない要素をクリックする

ダイアログボックスに表示している項目を編集・削除を行いたいけれどフォーカスが当たっていないときのこと

FireFox、IE、Chrome でのこと

例えば、こんなとき

(項目の緑は文字色・背景色)

SeleniumIDEで作成したとき、

click css=a[name="delete"] > div.ui-act-inner > span.ui-act-label

これだけで削除できた

But!

Javaソースに変換して実行するとエラーになってしまった

Javaソースコード
selenium.click("css=a[name=\"delete\"] > div.ui-act-inner > span.ui-act-label");

ここでエラー発生
com.thoughtworks.selenium.SeleniumException: Element is not currently visible and so may not be interacted with ...

フォーカスが当たっていない為にエラーなので

selenium.click("css=div.el-label");

でフォーカス当てて  



selenium.click("css=a[name=\"delete\"] > div.ui-act-inner > span.ui-act-label");
を実行してOK