Selenium RC 0.9.2 の captureScreeshot 機能を使ってみる

そういえば去年リリースされた Selenium RC 0.9.2 で追加された、画面キャプチャをとるらしい機能を使ってみようと思ってずっと忘れていたことに気付いた。

試してみたところ、実行は簡単で、Perlのクライアントを使った場合は、'capture_screenshot' というサブルーチンを使います。引数にはキャプチャした画像の保存先を渡します。たとえば以下のような感じ。

#!/usr/bin/perl

use strict;
use warnings;
use Test::More tests => 1;
use Test::WWW::Selenium;
use utf8;

my $sel = Test::WWW::Selenium->new(
        host => '192.168.123.123',
        port => 24444,
        browser => '*iehta',
        browser_url => 'http://www.google.co.jp',
);

$sel->start();
$sel->open('http://www.google.co.jp');
$sel->type("q", "hello");
$sel->click("btnG");
$sel->wait_for_page_to_load(5000);
$sel->title_like(qr/Google 検索/);
$sel->capture_screenshot('C:\hoge.png');   # ←スクリーンショットとる
sleep 30;
$sel->stop();

'192.168.123.123' のポート '24444' で、RCサーバが起動しているという前提です。今回なぜか、ブラウザの指定を '*iexplore' にしてもふつうの Internet Explorer がラウンチされなかったので、 '*iehta' で試してます。

で、実際試してから気付いたことが、考えてみればあたりまえなのですが、ブラウザの表示内容だけではなく、画面全体のキャプチャがとれてしまう、ということ。
なので、

  • 他のウィンドウが前面に出てるとそれがブラウザを隠してしまう
  • スクロールするような画面では、画面の下のほうが見られない
  • スクリーンセイバーがかかっているとその画面になってしまう

といったことがあります。最後のスクリーンセイバーのことは、 http://d.hatena.ne.jp/w650/20071115/p1 の内容を見て、自分でも試してみたところそのとおりで、ばっちりスクリーンセイバーの画面がとれてました。。これ、スクリーンセイバーの設定が義務付けられているうちの会社では地味に障害となるなぁ。。

画面キャプチャの融通を利かすのであれば、 http://hoshinanonikki.net/20070627.html#p01 で述べられているような外部アプリを駆動するほうが、用途によっては良い場合があるかもしれません。

とは言っても、「テストがエラーで落ちたときにどういった画面だったのか知りたい」とか、「システムエラーの画面が出ていないか」とかいったことのチェックのために画面キャプチャをとりたいといった要件であれば、上記の点に気をつけて使う限り、このSeleniumの機能もかなり役に立つ場面はあると思います。