miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

IE + Selenium Core で captureEntirePageScreenshot が動かない件

会社で表題の件が話題に上ったので、色々と半端ですがノウハウを吐き出しておきます。

Selenium でのキャプチャ取得について、基本的なところ

2 年ほど前は

  • Selenium RC で captureScreenshot を使ってデスクトップ全体をキャプチャする
  • Selenium IDE で Pearl Crescent Page Saver のショートカットキーを押下する

みたいな方法しかなかったんですが、captureEntirePageScreenshot というコマンドが使えるようになっていますので、特に理由がない場合はこちらを使いましょう。

詳細は以下の URL を参照ということで。

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 ってところからダウンロードできます。

書き残したこと

ちなみに、今回書いた内容は、

この頃に書こうと思いつつ、別の件に絡めて書くつもりで保留していたものだったり。まだ書ききれてない問題点(環境によってキャプチャ結果が微妙に違うだとか)が他にあるので、余裕のあるときにまとめて書こうかと。