テスト自動化(6) Selenium クロスブラウザ対応

こんにちは
ヒューマンクレスト浅黄です。

Seleniumにてテスト自動化した際、1ブラウザ(例えばFirefox)だけではなく、ChromeやInternet Explorer、safariでも同様にテストできるようにすることがあると思います。基本は、1つのスクリプトで複数のブラウザが動くようにできれば、一番うれしいと思います。
前回のエントリーでは、その基礎となるSelenium Gridでした。
今回は、クロスブラウザ対応した際に、苦労した(エラーになった)箇所を何点かまとめて記載します。

  • frameの移動

通常は

driver.switchTo().frame(arg0);

引数のarg0に指定できるのは、インデックス、フレームの名前、WebElementの3種類あります。
Firefoxを利用して自動化しているとき、.frame(0)や.frame(1)で移動していましたが、Chromeでは思うような動作をしない場合がありました。
回避策は、WebElementを指定することです。

WebElement elm = driver.findelemnt(by.xpath("//iFrame[@name='menu')]"));
driver.switchTo().frame(elm);

ほぼすべてのブラウザで通用するので、初めからWebElementの指定をすることをお勧めします。

  • 見えないボタンの操作

webページのボタンを押す。Firefox,Chromeは動作するが、Internet Explorerでは動かない場合がありました。
これは、操作対象のWebElementがブラウザの表示領域に無い場合であり、ボタンだけではなく、inputやcheck、リスト表示等の隠れた部分でも発生することがあります。(画面のレンダリングが表示によって実行される場合)
解決策は、画面をスクロールして、ボタンを表示領域まで移動させたあとに、ボタンを押すことです。

//ページダウンを押下してスクロールさせる
Actions act = new Actions(driver);
act.sendKeys(Keys.PAGE_DOWN).perform();
//ボタンを押下する
frame.findElement(By.id("button").click;

スクロールして表示領域に持ってくる為、PC画面サイズや移動距離を検討する事になり、動作させるPCの入れ替え時は注意が必要です。

  • 印刷ダイアログ

作りによりますが、印刷ダイアログの扱いが若干違います。
Internet Explorerの場合、ポップアップアラートと同様に操作可能な場合があります。

Alert alert = driver.switchTo().alert();
alert.accept();//または、alert.dismiss()

ChromeやFirefoxの場合は、ブラウザの制御から外れてしまう為に、WebDriverでは操作できない場合が多いです。
その場合、JavaのRobotを利用する時があります。

Robot r = new Robot();
r.keyPress(java.awt.event.KeyEvent.VK_ESCAPE);
r.keyRelease(java.awt.event.KeyEvent.VK_ESCAPE);

safariはそもそも、ポップアップやダイアログ、別ウインドウを呼び出すようなアクションを行うと、動作しないか、最悪はエラーでWebDriverが落ちます。だいぶ動くようになってきましたが、他のブラウザでできてsafariでできないことが多いように思います。
ダイアログ操作の場合は、どうしても場合分けが必要になることが多いです。

様々なケースがありますが、出来る限り1スクリプトでクロスブラウザテストができるように心がけて日々格闘しています。

このエントリーをはてなブックマークに追加

1件のコメント

ただいまコメントは受け付けていません。