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/アドオンを追加してください。