Selenium RC のテストを別環境で動かすときの注意点

Selenium を使った自動テストを今までは主に Windows 上で実行していましたが、最近 X Window が乗った Linux 上で実行させる機会がありました。いくつかひっかかったポイントがあったので記録しておきます。

なお、僕の場合、テスト作成〜実行までの基本的な流れは以下のような感じです。

  1. Windows 上で FirefoxSelenium IDE を使ってテストケースの主要な部分を録画・作成
  2. Selenium IDE でそれを Perl にエクスポートし、Test::WWW::SeleniumSelenium RC のクライアントドライバーとして利用したスクリプトを作成
  3. 上の Perl スクリプトを Linux 上で実行して、Windows 上で起動している Selenium RC サーバをキックし、その Windows の Firefox でテストを流す

今回は最後の、Perl スクリプトを実行する Linux と、 Windows 上の RC Server + Firefox でのテストの部分を、別の X WindowLinux に置き換えた場合の問題について記述しています。

テストが終了しても Firefox が閉じない

Windows 上の Selenium RC Server + Firefox でテストを実行した場合は、テストケースの終了と同時に勝手に Firefox が終了していたのですが、 LinuxX Window 上で実行すると Firefox が開いたままになりました。

解決は単純に、テストケース中で start と stop を明記すればよいようです。

use Test::WWW::Selenium;
my $sel = Test::WWW::Selenium->new{ (省略) };

$sel->start;

・・・テスト内容・・・

$sel->stop;

全角チルダ/波ダッシュ問題

Windows で作成したテストケース中で、表示されたウェブページ内の文字列の確認(VerifyText 等)を行っている場合、いわゆる「全角チルダ」「波ダッシュ」の問題にひっかかる可能性があります。

$sel->is_text_present("1件〜30件");
|perl|<

たとえば、上のように「1件〜30件」という文字列が表示されていることを確認しようとした場合、「〜」の部分を波ダッシュ(U+301C)として文字マッチしてほしいのに、Windows上で作成したテストケース中では全角チルダ(U+FF5E)として保存されてるために文字マッチしないようです。Linux 上で、テストケースを作成すれば、本来の波ダッシュ(U+301C) として保存されるので、期待通りマッチします。

参考リンク:
- http://www.informe.co.jp/useful/character/character14.html
- http://ja.wikipedia.org/wiki/Unicode#.E6.97.A5.E6.9C.AC.E8.AA.9E.E7.92.B0.E5.A2.83.E3.81.A7.E3.81.AEUnicode.E3.81.AE.E8.AB.B8.E5.95.8F.E9.A1.8C
- http://ja.wikipedia.org/wiki/%E6%B3%A2%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5#Unicode.E3.81.AB.E9.96.A2.E9.80.A3.E3.81.99.E3.82.8B.E5.95.8F.E9.A1.8C


** (おまけ) マルチバイト文字列の扱い

これは Selenium とは関係ない Perl の問題で、日本語文字列などの扱いに注意が必要かもしれません。(特に、別ファイルから文字列を読み込んだりしている場合など)

個人的に今回ひっかかった問題は、YAMLファイルから一部のロケーター(例: "//input[@value='ログイン']")を読むようにしていた箇所で、最初は以下のように記述していました。

>|perl|
use YAML qw(LoadFile);
my $config = LoadFile("config.yaml");
decode("utf8", $config->{login_button_locator});
$sel->click_ok($config->{login_button_locator});

最初手元の環境で利用していた YAML モジュールの古いバージョン(0.66) ではこれで動作していたのですが、新しいバージョン(0.72) が使える環境にもっていくと以下のエラーで落ちます。

Cannot decode string with wide characters at /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/Encode.pm line 174.

最初原因が分からなかったのですが、YAML の LoadFile の中を見ると新しいバージョンでは

 binmode $IN, ':utf8';

として、デコードしてくれるようになったからのようで、すでにデコードされて utf8 フラグが立ってる文字列をさらにデコードしようとしてエラーになっていた模様。

今回の件はだいぶニッチな感じでしたが、 PerlCPANモジュールのバージョンが異なる環境で動かす場合は、このあたりのエンコードのタイミングなども注意が必要なことが、実装の仕方によってはあるかもしれません。