RubyがSeleniumと相性がいい話

2014 年 3 月 19 日 by 山平

自動テストで有名なSeleniumですが、核になる技術はブラウザを自動運転するWebDriverです。
これを使えば、ブラウザが必要な操作も自動化できてしまいます。

RubyとSeleniumは非常に相性が良いと感じます。

SeleniumというよりもWebページの構造上、クリック後の処理待ちなどが発生するため、プログラム的に美しく記述することが難しいことがよくあります。
また、ブラウザ操作を行うプログラムは、ログイン・ログアウトといった共通処理が少なくありません。
ブロック付きメソッドを簡単に実装できるRubyだと、そのへんをすっきりと記述することができます。

今回は、社内で使用しているグループウェアの処理を自動化してみました。
公開できない部分だけ差し替えたソースコードを公開します。

ここからはソースコードの説明になります。

設定ファイル

ログイン情報などはYAMLで外出しにしています。
YAMLは扱いも楽なので、設定ファイルのフォーマットに悩む必要がないのも何気に嬉しいポイントですね。

login_actionメソッド

login_actionメソッド内では、以下の処理を行います。

  • ブラウザの起動
  • ログイン
  • ブロックの実行 ※ここがポイント!
  • ログアウト(はしていないケド。。。)
  • ブラウザの終了

ここにはブラウザ操作の基本のみを記述しており、具体的な操作はブロックで受け取る、という記述が簡単なのが非常に楽です。

hyogo_iineメソッド

hyogo_iineという具体的な処理を行うメソッドを定義します。
ここでは、掲示板のすべての書き込みの「いいね!」をクリックしています。

最初に書きましたが、クリック後の処理待ちの記述は面倒です。
今回の「いいね!」はクリックするとAjaxが走るので、特に面倒くさい処理になるのですが、ここでRubyの表現力が活きてきます。

break if browser.find_elements(:xpath, xpath).all?{|span| !span.displayed? }

まず、読み込み待ちのときに表示される画像をすべて取得します。
Array#all?メソッドで、すべて非表示かどうかを調べます。
表示中の読み込み待ち画像が残っていたら、1秒待って処理を繰り返します。

文末

最後に、クラスファイルが他のRubyプログラムから呼ばれていない場合の処理を記述しています。
こうすることで、組み込んで使うことも、コマンドラインプログラムとして利用することも可能になります。

タグ: ,

TrackBack