ここでは各ブラウザの差違やSeleniumIDEとの違い、変換コードでは検証できない等、実用した場合についてのTipsを説明する。(これまでの説明と重複する内容も含む)
原因は特定できない為、何か問題が発生した場合の参考としてください。
A) 各ブラウザでSeleniumが取得するテキストが違う場合がある
waitForTableコマンドの変換コードでFireFoxは実行NGだが、IEではOK、ChromeはNGとなった。
文字表現:□・・・全角スペース []・・・半角スペース \n・・・改行
文字表現:□・・・全角スペース []・・・半角スペース \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では実行できなかった。FireFox、IEでは実行OKといった場合、Chromeではソースをselenium.getHtmlSource()で読み込み対象要素が存在するか調べるようにした。
D) ブラウザの実行と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に設定して試験するようにしている。
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だが、IEとChromeではNGとなった為、次の様に指定した。
I) ブラウザ複数起動
Selenium Driverは複数起動可能なので、同一ブラウザの複数起動に対応可能である。
対象ウィンドウ*1の切り替えについては、
FireFoxは、SeleniumインスタンスとWebDriverインスタンスの指定で行う。
IEは、Seleniumインスタンス指定で切り替えが不可なので、WebDriverインスタンスを指定して行う。
*1 対象ウィンドウとはブラウザ毎のウィンドウを示している
J) IE固有
IEは、FireFoxやChromeと違う現象を発生することがある。
例1.
ブラウザ複数起動を行った時、下のSeleniumAPIの実行がIEではNGになった。
単一ブラウザでは問題の無いSeleniumAPIである。clickのAPIが問題であるのか対象要素に問題かはわからない。
selenium.click("css=a[name=\"send\"]");
SeleniumAPIで対応できなかった為、WebDriverAPIに変更したが、NGとなった。
param.driver.findElement(By.xpath("//div[@name='send']//a[@name='send']")).click();
このようにIEではNGになる記述が時々、見られる。
例2.
本来なら成功する検証が失敗になることがある。
原因を特定できないが、検証中に他アプリケーションを実行すると失敗するように見受けられる。