IE + Selenium Core で captureEntirePageScreenshot が動かない件
会社で表題の件が話題に上ったので、色々と半端ですがノウハウを吐き出しておきます。
Selenium でのキャプチャ取得について、基本的なところ
2 年ほど前は
- Selenium RC で captureScreenshot を使ってデスクトップ全体をキャプチャする
- Selenium IDE で Pearl Crescent Page Saver のショートカットキーを押下する
みたいな方法しかなかったんですが、captureEntirePageScreenshot というコマンドが使えるようになっていますので、特に理由がない場合はこちらを使いましょう。
詳細は以下の URL を参照ということで。
- モダンな Selenium でスクリーンキャプチャ/スクリーンショット (Screen capture / Screen shot)方法 - Yamashiro0217の日記
- たぶん最初に captureScreenshot の説明をしてくれたサイト。IE で必須な snapsIE の説明あり。
- SeleniumRCを使って主要ブラウザで画面のキャプチャを撮る方法 - tanamonの日記
- Firefox で必要な Screengrab! やセキュリティまわりで必要な設定、それ以外のブラウザはダメな旨等々、ここからたどれます。
IE + Selenium Core で動作させると・・・
error(1278742162766): Snapsie failed: Failed to get HWND for browser (is this a frame?)
みたいなエラーになって、うまくキャプチャが取得できなかったりします。
原因
scripts\selenium-api.js 内の Selenium.prototype.doCaptureEntirePageScreenshot に
if (typeof(runOptions) != 'undefined' && runOptions.isMultiWindowMode() == false) { // framed mode : } else { // multi-window mode : }
こんな処理があって、フレームモード(=シングルウィンドウモード)かマルチウィンドウモードか切り替えていますが、Selenium Core では常に mutiWindow が undefined になっており、マルチウィンドウモードの処理に入っているようです。
Selenium Core のデフォルト動作はフレームモードですから、ここでウィンドウの取得に失敗しているようで、試しに multiWindow=on で起動すれば(TestRunner.html で「AUT in separate window」にチェックしておけば)キャプチャは正常に動作しました。
フレームモードで動作させるための修正・・・だと思っていたもの
前項で「Selenium Core では常に mutiWindow が undefined になっている」と書きましたが、実はこのエントリを書き始めるまでは「デフォルトでは multiWindow パラメータが渡されないから multiWindow == undefined になっている」のだと思って、以下のように対策していました。(※if と else を逆にしちゃえばもっと綺麗な条件式にできるんですが、変更行が少なくなる書き方にしています。)
--- core/scripts/selenium-api.js.org Tue Jun 09 11:59:28 2009 +++ core/scripts/selenium-api.js Sat Jul 10 15:43:23 2010 @@ -2747,7 +2747,8 @@ return msg; } - if (typeof(runOptions) != 'undefined' && + if (typeof(runOptions) == 'undefined' || + typeof(runOptions) != 'undefined' && runOptions.isMultiWindowMode() == false) { // framed mode try {
常に multiWindow が undefined になっているとしたら、Core 用に別の取得方法を考えるべきで・・・そうなってくると Selenium がどういう設計になってるかわからないから、ちゃんとソース読まないと適切な対応はできないですね。
みなさん RC で実行してるから問題にならないのかな?と思っていたんですが、Selenium RC でも同様のエラーメッセージが出ているという話があるようで・・・こちらは SnapsIE 側の問題とのことですが、一応 URL を貼っておきます。
Selenium Core で Selenium IDE のコメントを表示
今試したらなぜかうまくいかなかったんですけど、一応 Seleniu Core まわりの Tips として書いておきます。
Selenium Core でテストする場合は Selenium IDE で挿入したコメントが見られなくて、テストに失敗したときにどのケースで失敗したかがわかりにくいです。
それを Selenium Core/RC でも表示する方法があって、
で配布されている user-extensions.js がそうなんですけど、インデントされてなくてわかりにくいので、インデントしたバージョンを Gist に置いておきました。
raw ってところからダウンロードできます。
書き残したこと
ちなみに、今回書いた内容は、
この頃に書こうと思いつつ、別の件に絡めて書くつもりで保留していたものだったり。まだ書ききれてない問題点(環境によってキャプチャ結果が微妙に違うだとか)が他にあるので、余裕のあるときにまとめて書こうかと。