Hatena::Groupsubtech

NaN days

ブログを移転しています。最新の記事は motemen.hatenablog.com へどうぞ

2012-07-03

Perl から PhantomJS を操作するライブラリを書きました

| 13:58 | Perl から PhantomJS を操作するライブラリを書きました - NaN days を含むブックマーク はてなブックマーク - Perl から PhantomJS を操作するライブラリを書きました - NaN days

Perl から PhantomJS を操作する、Wight という名前のライブラリを書きました。PhantomJS は GUI なしのブラウザみたいなやつです。(てきとう)

まだ完成とはいい難いですが GitHub にあがってます。

https://github.com/motemen/Wight

使い方

基本的にウェブアプリケーションのテストのためのモジュールになってます。以下を見ればだいたい雰囲気が分かるのではないかと思います:

use Wight;

my $wight = Wight->new;

$wight->spawn_psgi('app.psgi');
$wight->handshake;

$wight->visit('/');
$wight->evaluate('document.title'); # => evaluates JavaScript expression

$wight->find('//a[@rel="next"]')->click;

$wight->spawn_psgi($file | \&code) で指定された PSGI アプリケーションを起動し、$wight->handshake で PhantomJS を起動して Perl 側との通信を始めます。それ以降は 用意されているメソッド を使って、Test::WWW::Mechanize::PSGI がやるような感じでアプリケーションとのインタラクションを行うことができます。テスト もご覧ください。クリックとかして JavaScript を普通に実行しています。

今のところノードの選択には XPath しか使えません、がさすがに不便なので (CSS) セレクタにも対応したい……です。

実装

Perl と PhantomJS は WebSocket を用いて通信しています。

……で、PhantomJS 側の実装にはすでに存在する Poltergeist という (Ruby の) Capybara の PhantomJS のドライバで使われている実装をそのまま使って楽してます。キモはこのクライアントサイドなのでほとんどタダ乗りです!!

Perl 側の実装には Protocol::WebSocketAnyEventTest::TCP を使ってるかんじです。

というわけで

WebKit でしかテストできないとはいえ、手元に PhantomJS さえ入っていれば JavaScript まで含めた PSGI アプリケーションのテストができるようになるため、せめて正常系のテストを気軽に試せるようにはなるのではないでしょうか。と思います。