2014年9月3日水曜日

7.Tips

Selenium7

ここでは各ブラウザの差違やSeleniumIDEとの違い、変換コードでは検証できない等、実用した場合についてのTipsを説明する。(これまでの説明と重複する内容も含む)
原因は特定できない為、何か問題が発生した場合の参考としてください。

A)  各ブラウザでSeleniumが取得するテキストが違う場合がある
waitForTableコマンドの変換コードでFireFoxは実行NGだが、IEではOKChromeNGとなった。
文字表現:□・・・全角スペース []・・・半角スペース \n・・・改行

SeleniumIDEで、
waitForTable (css=form[name="form_rcv"] > table.6.1, 自動で確認する[]1分間隔□[]3分間隔□[]5分間隔□[]10分間隔□[]15分間隔□[]20分間隔) 
と指定した変換コードは下の通り
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);
}

対処として、
検証対象の語句間が各ブラウザによって以下のように違う為、ブラウザ判定により検証テキストを設定した。
検証テキストの内容
[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分間隔□

※どの場合でも上の様な文字列になるかは不明である。

B)  css指定できない場合がある
css指定でNGになることがあり、xpath指定で対応した。

C)  xpath指定ができない場合がある
xpath指定ができない場合は、css指定もできないことが多い。このような場合は、対象ページのソースを読み込み、検証したい要素が存在するか調べる方法を取ることができる。
例えば、アイコンファイル名検証の為、waitForElementPresentコマンドをxpath指定を行い、変換コードを実行したところChromeでは実行できなかった。FireFoxIEでは実行OKといった場合、Chromeではソースをselenium.getHtmlSource()で読み込み対象要素が存在するか調べるようにした。

D)  ブラウザの実行とSeleniumAPIとの実行時間差
ブラウザがページを処理する時間よりSeleniumAPIの実行時間の方が速い為、SeleniumAPIの方でタイムアウトになる事がある。
対処としては、、setTimeout APIでタイムアウト時間を変更する。
デフォルトは30000 msecで設定している。
例えば、<textarea>に文字列を入力する場合、selenium.type()を実行するが、FireFoxChromeではデフォルトで実行OKであったが、IEではNGとなった。
FireFoxChromeの文字列入力の様子とIEの文字列入力の様子を見ると、IEの方が入力に時間がかかっていることが分かった為、selenium.setTimeout()を使用してタイムアウトを( 120000 )と設定したところ、IEも実行OKとなった。

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

E)  対象ページ・対象要素のロードとプログラムの実行時間差
対象ページ・対象要素のロードよりプログラムの実行の方が速いのでプログラムには適宜、Thread.sleep()を行う様にするとよい。
pauseコマンドはThread.sleep()に変換される。

F)  アドオン・プラグインの影響
検証ページがアドオン・プラグインの影響を受ける可能性があることも考慮する。

例.Skypeをインストールしている場合
ページに電話番号を表示する場合、Skypeアイコンを付加することがある。
検証タイミングや検証データを工夫するする必要がある。

G)  ウィンドウの切り替え
メインウィンドウからポップアップウィンドウ、ポップアップウィンドウからメインウィンドウに戻る場合には、SeleniumAPIは自動で対象ウィンドウを認識しない為、selenium.selectWindow()selenium.selectPopUp()を呼び出す。
これらを呼び出した際には、ページロードを行うので、Thread.sleep()でページロードを待つようにする。

Chromeでウィンドウの切り替えを行うと、下のメッセージをChromeドライバが出力する。
[20.538][SEVERE]: Unable to receive message from renderer

H)  フォーカス
リスト表示している項目を選択する場合、フォーカスを当てる必要がある。
例.
 リストの先頭にフォーカスを当てる場合、focusコマンドとkeyコマンドを組み合わせる。
 このコマンド(SeleniumAPI)はFireFoxではOKだが、IEChromeではNGとなった為、次の様に指定した。

I)  ブラウザ複数起動
Selenium Driverは複数起動可能なので、同一ブラウザの複数起動に対応可能である。
対象ウィンドウ*1の切り替えについては、
FireFoxは、SeleniumインスタンスとWebDriverインスタンスの指定で行う。
IEは、Seleniumインスタンス指定で切り替えが不可なので、WebDriverインスタンスを指定して行う。
*1 対象ウィンドウとはブラウザ毎のウィンドウを示している

J)  IE固有
IEは、FireFoxChromeと違う現象を発生することがある。

 例1.
ブラウザ複数起動を行った時、下のSeleniumAPIの実行がIEではNGになった。
単一ブラウザでは問題の無いSeleniumAPIである。clickAPIが問題であるのか対象要素に問題かはわからない。
selenium.click("css=a[name=\"send\"]"); 
SeleniumAPIで対応できなかった為、WebDriverAPIに変更したが、NGとなった。
param.driver.findElement(By.xpath("//div[@name='send']//a[@name='send']")).click();
このようにIEではNGになる記述が時々、見られる。

例2.
本来なら成功する検証が失敗になることがある。
原因を特定できないが、検証中に他アプリケーションを実行すると失敗するように見受けられる。


上に戻る

0 件のコメント:

コメントを投稿