※本稿は
Selenium Advent Calendar 2013 の投稿記事です。
起
Selenium は言わずと知れた(?)、Webアプリケーションに対する自動化テストを実現するための様々なソフトウェア群。
とくにここでは、各種OS・各種プログラミング言語からWebブラウザを "自動操縦" する、一般に Selenium WebDriver と呼ばれる機能に焦点を当てた話題をとりあげる。
さてその Selenium。
実際の業務において、C# で記述した品質検査用プログラムが Web ブラウザを自動操縦するところで活用している。
承
そんなある日、とある不具合にぶちあたった。
自分の開発マシン上では正常に動作する Selenium 利用による自動化テストシナリオが、品質検査担当者の環境ではなぜか失敗するのだ。
ログを確認すると、シナリオの途中で "Webページ上のあるボタンをクリックせよ" というステップがあるのだが、そのボタンクリックが動作していないことがわかった。
自分の開発マシンでは正しくクリックされるのに、品質検査担当者による模擬環境ではクリックされない。
Selenium WebDriver による Web ページ上の要素のクリックなんぞは、あまりに基礎的な機能なだけに、どんな不具合が一体あるというのか想像も難しくしばし途方に暮れた。
転
と、ふと品質検査担当の模擬環境とで佇んでいるブラウザの様子に目を留めると...
クリック対象のボタンが、見えてはいるのだが、
半分くらいスクロール領域外にはみ出していた
のだ。
解像度が異なる自分の開発環境では、そのボタンは、きっちりクライアント領域内にすべて収まっていた。
まさか、まさか、
たった半分ほどスクロールアウトしていることが原因
なのか?
ということで、クリック処理を次のように書き換えてみた。
var element = webDriver.FindElement(By.Id(idOfElementToClick));
var remote = element as RemoteWebElement;
var hack = remote.LocationOnScreenOnceScrolledIntoView;
element.Click();
LocationOnScreenOnceScrolledIntoView プロパティを "参照" しているところがミソ。
LocationOnScreenOnceScrolledIntoView プロパティを参照することにより、対象の要素をスクロール領域内にまでスクロール位置を進めたうえで、その座標が取得できる。
要素の座標には興味はないが、
対象要素を確実にスクロール域内まで引き込んでくれる
のが狙い。
そのうえで要素のクリックを実行するわけだ。
結
結果、問題のボタンクリックが確実に動作するようになった。
なお、今回遭遇したこの問題は、すべてのブラウザに対して発生するかどうかは不明。
自分が掌握している限りでは、IE8 では発生していた。
いずれにせよ、これで誰の環境でも、以前より安定して Selenium による自動化テストが実行されるようになった。