Selenium RC のテストを別環境で動かすときの注意点
Selenium を使った自動テストを今までは主に Windows 上で実行していましたが、最近 X Window が乗った Linux 上で実行させる機会がありました。いくつかひっかかったポイントがあったので記録しておきます。
なお、僕の場合、テスト作成〜実行までの基本的な流れは以下のような感じです。
- Windows 上で Firefox と Selenium IDE を使ってテストケースの主要な部分を録画・作成
- Selenium IDE でそれを Perl にエクスポートし、Test::WWW::Selenium を Selenium RC のクライアントドライバーとして利用したスクリプトを作成
- 上の Perl スクリプトを Linux 上で実行して、Windows 上で起動している Selenium RC サーバをキックし、その Windows の Firefox でテストを流す
今回は最後の、Perl スクリプトを実行する Linux と、 Windows 上の RC Server + Firefox でのテストの部分を、別の X Window 付 Linux に置き換えた場合の問題について記述しています。
テストが終了しても Firefox が閉じない
Windows 上の Selenium RC Server + Firefox でテストを実行した場合は、テストケースの終了と同時に勝手に Firefox が終了していたのですが、 Linux の X 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 フラグが立ってる文字列をさらにデコードしようとしてエラーになっていた模様。
今回の件はだいぶニッチな感じでしたが、 Perl やCPANモジュールのバージョンが異なる環境で動かす場合は、このあたりのエンコードのタイミングなども注意が必要なことが、実装の仕方によってはあるかもしれません。