RubyによるWebテスト自動化ツール Watir

お仕事でちょっと負荷テストをしたいなぁと思いまして、対応するツールを調べていましたところ、watir というRubyのツールを見つけました。(何て読むんでしょうね?「ウェイター」?「ワチール」?)
インストール方法はシンプルで以下のコマンドを実行するだけです。

> gem update --system
> gem install watir -r -y 

さて、実行したところ驚かされるのが、依存関係の多さ。いっぱいインストールされました。

C:\ruby18\bin>gem dependency watir -r -V
GET 304 Not Modified: http://gems.rubyforge.org/latest_specs.4.8.gz
Gem watir-1.6.5
  win32-process (>= 0.5.5, runtime)
  windows-pr (>= 0.6.6, runtime)
  commonwatir (= 1.6.5, runtime)
  firewatir (= 1.6.5, runtime)
  nokogiri (>= 0, runtime)

C:\ruby18\bin>gem dependency windows-pr -r -V
GET 304 Not Modified: http://gems.rubyforge.org/latest_specs.4.8.gz
Gem windows-pr-1.0.8
  windows-api (>= 0.3.0, runtime)
  win32-api (>= 1.4.5, runtime)

C:\ruby18\bin>gem dependency commonwatir -r -V
GET 304 Not Modified: http://gems.rubyforge.org/latest_specs.4.8.gz
GET 200 OK: http://gems.rubyforge.org/quick/Marshal.4.8/commonwatir-1.6.5.gemspec.rz
Gem commonwatir-1.6.5
  user-choices (>= 0, runtime)
  hoe (>= 2.3.3, development)

C:\ruby18\bin>gem dependency firewatir -r -V
GET 304 Not Modified: http://gems.rubyforge.org/latest_specs.4.8.gz
Gem firewatir-1.6.5
  commonwatir (= 1.6.5, runtime)
  activesupport (>= 0, runtime)

C:\ruby18\bin>gem dependency nokogiri -r -V
GET 304 Not Modified: http://gems.rubyforge.org/latest_specs.4.8.gz
Gem nokogiri-1.4.0-x86-mswin32
  racc (>= 0, development)
  rexical (>= 0, development)
  rake-compiler (>= 0, development)
  hoe (>= 2.3.3, development)

C:\ruby18\bin>gem dependency user-choices -r -V
GET 304 Not Modified: http://gems.rubyforge.org/latest_specs.4.8.gz
GET 200 OK: http://gems.rubyforge.org/quick/Marshal.4.8/user-choices-1.1.6.gemspec.rz
Gem user-choices-1.1.6
  xml-simple (>= 1.0.11, runtime)
  s4t-utils (>= 1.0.3, runtime)
  builder (>= 2.1.2, runtime)
  hoe (>= 1.3.0, runtime)

たまにMLで目にする話題のnokogiriやactivesupportが入っていたりしますので、インストール中はちょっと慌てました。

使い方は、RDocを読んでいただければいいのですが、ASRで使った場合はこんな感じでした。

#! ruby -Ks
require 'rubygems'
require 'watir'
ie = Watir::IE.new

# サイトを開く
site = 'http://www.google.com'
ie.goto site

# 入力して実行
form = ie.form(:name, 'f')
txfield = form.text_field(:name, 'q')
txfield.value = 'raito'
button = form.button(:name, 'btnG')
button.click

面白かったのは、ボタンオブジェクトに対して利用できるクリックイベント発生用メソッドに、click, click!, click_no_waitの3種類があることです。

  • click はクリック結果が表示し終わるまで待ちます。
  • click! はクリックをした直後の状況を扱えます。(待ちません)
  • click_no_wait はソースをよく読んでいないので、わかりません。

前の2つのメソッドを使い分けることで、click で問題のあるページに確実に移動し、click! で問題となっているアクセスを連発する、なんてことができるわけです。