Watirでブラウザテストを自動化する

仕事で大量のURL(十数万)にブラウザからアクセスして挙動を確かめたい、という要件がありました。(例えば、htmlに不適切なJavascriptコードが含まれてないか、など。例えば。)

最初はmechanizeで適当にすまそうと思ったのですが、今回の案件はJavascriptを実行した結果を検証する必要があったので残念ながら却下。さてどうしようかと考えていたのですが、同僚の@くんにWatirを教えてもらったので使ってみました。

Watirとは

Waitr(ウォーター)はRubyからIEを操作して自動テストを実現するライブラリです。

インストール

gemで一発インストール。

gem update --system
gem install watir

IEgoogleにアクセスする

以下はIEを起動してgoogleへアクセスするコード。Watir::IE.newをするとブラウザが起動して、goto(url)を実行すると、該当のURLにアクセスします。

require "watir"
ie = Watir::IE.new
ie.goto("http://www.google.com/")

テキストフィールドに文字列を追加

nameがhogeのテキストフィールドにfooという文字列を追加するのはこんな感じ。

ie.text_field(:name => "hoge").set "foo"

IEを操作してhtmlを取得するので、サーバーから返却されたhtmlもjavascriptが実行された後の状態でオブジェクト化されています。なので当然javascriptが追加した文字列を取得する、ということも出来たりします。
例えばjavascriptでh1タグをappendしていたら、それもオブジェクトとして取得できました。すばらしい。

困ったこと

ただ、試しに適当なスクリプトを作って10万件ほどのURLを食わせておいて次の日に見たら、1万件くらいで処理が止まっていました。原因はIEのTemporary Internet Filesディレクトリ内のファイル容量が制限を超えていたため。。。ディレクトリを読み込み専用にしてしのぎました。

また、ローカルPCのIEを自動操作するライブラリの特性からか、はたまた公式サイトの情報が古いのか、サンプル通りにコードを書いても動かないこともあるので注意です。