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プログラムから呼ばれていない場合の処理を記述しています。
こうすることで、組み込んで使うことも、コマンドラインプログラムとして利用することも可能になります。