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の機能もかなり役に立つ場面はあると思います。

半角カナってなんでダメなんだっけ?

うちの会社で作っているアプリケーションは昔からフレームワークのレベルで半角カナの入力を受け付けないようにエラーチェックがかかるようになってますが、今日、とっさにその理由を聞かれて答えられない自分に気付きました。。

そんなときのWikipedia半角カナのページに、よくまとまっていました。

メールで半角カナが使えないと言われるのは、ISO-2022-JISに、JIS X 0201の片仮名が含まれていないことによるもの。WEBアプリで一般的に使わないのは、EUC-JP と Shift_JISの間で文字コードの範囲がかぶって自動認識に失敗することがあるから、ということっぽい。

・・・ということでいいのだろうか?半角カナを禁止してるWEBアプリなんて最近はもうあまりない気もするが、主にビジネスユースのアプリでわざわざ開放することはないだろうし、とりあえずなぜ禁止されているか、と聞かれれば、このへんを経緯として話して、無難だから、といえばいい気はする。なんか妥協っぽいけど。

mysql の last insert id

mysql だと、最後に登録された auto_increment の主キーのIDを LAST_INSERT_ID() という関数で取得できるのだと知りました。

→ 参考: http://it.kndb.net/entry/show/id/78

Perl のプログラムで DBD::mysql を利用している場合、$dbh がDB接続のハンドルだとして、

 my $last_id = $dbh->{'last_insertid'}

とすればINSERT直後のIDが取得できるみたい。

→ 参考: http://search.cpan.org/dist/DBD-mysql/lib/DBD/mysql.pm#DATABASE_HANDLES

こういう細かい知識が、日ごろコーディングしてないと全然身につかない。。今後積極的にメモしていこう。

The Future of JavaScript の個人的なメモ

少し時間が空いてしまいましたが、先週金曜日(2007-11-02)、Mozilla & Shibuya.js によるトークイベント"The Future of JavaScript"に行って話を聞いてきました。
普段コーディングをしていない人間なので、理解しきってない部分が多々ありますが、個人的なメモをdumpしておきます。自分自身で理解できず書いてる部分あるので、あまり参考にしないでください。

ES4については、一言で言うと、下位互換を重視しつつ、固くオブジェクティブに作ろうと思えば作れるように拡張していく、といった感じでしょうか。

堅苦しい言語になってしまうのでは?と懸念する空気が会場にありましたが、クラス定義などはあくまで拡張であり、それを使うかどうかは書き手次第、逆に使わなければこれまでどおり柔軟なものとして扱えるよ、ということを主張されていたと思います。

たとえば、class 型で宣言したものはかなり堅牢に隠蔽化がされるようですが、dynamic class という型もあり、それを使えば property の動的な割り当てもできる、さらにその中でも、private を指定すればプライベートな変数も宣言できる、といった感じで、利用シーンや必要に応じて使い分けることが重要そうです。

その他、Class関連の言語仕様について。。。

  • 継承とインタフェースがサポートされる
  • final で継承されるのをブロックできる
  • 継承は1つ(多重継承はできない)、インタフェースは複数OK
  • Catch-All = rubyでいう"Method Missing"(methodがなかった場合の振る舞いを定義)

さらにそれ以外の細かな言語仕様について。。。

  • type と interface の違い?
    • type は構造定義のみ、like で一致をみる
    • interface は is で一致をみる
  • this: 受け取る引数の形式を指定(違ったらエラーを返す)
  • arguments は fake array じゃなくて実際の array になる
  • Map = key と value を保持する
    • key には Object も使える
  • let は Perl でいう my みたいなものっぽい
  • Package →隠蔽化。public のものだけが外から呼べる。
  • multimethod → いわゆるオーバーロード ?
  • Unit ≠ Package (このへんがよくわからない…). Unit はインポートに使う

その他、ES4をとりまく環境などについて

  • IEにも "Screaming Monkey" というサブプロジェクトを通じて互換性のあるエンジンを搭載させる
  • ActionScript 4 は、ECMAScript 4に沿うために ActionScript3 との互換性を捨てた
  • 各ブラウザが対応して、実際に動作環境が普及してくるのは2009年ごろでしょう
  • 型指定しなくても、Tamarinのエンジン内で最適化してるから速度は出るけど、指定したほうが速い
  • グローバルなクラスは直接いじれないけど、グローバルなオペレーションはいじれる
    • たとえば「+」は intrinsic namespace (?)