momota.txt

hello, hello, hello, how low?

ブラウザ操作の自動化: Selenium と Ruby

selenium と ruby を使ってブラウザ GUI 操作を自動化する。

selenium は、Web アプリケーションの自動テストのためのツール。 レグレッションテストによく使われているようだ。

selenium は、ブラウザ操作シナリオを事前に設定して、シナリオ通りに実行してくれる。 シナリオ設定といっても、Firefoxプラグインの Selenium IDE などを使うと操作を 記録してくれる機能があるのでそこまで大変ではない。 詳細は、Ruby アソシエーション – selenium の “1.2 テストの作成” あたりを参照してほしい

selenium は、クロスブラウザのツールで、IE を使って IE限定みたいなサイトでも使える。 IE や Chrome で使うには各 Selenium WebDriver が必要となる。

テスト用と言いつつ、使い道はいろいろとある。

  • 社内のもろもろの web 申請は、入力項目が多いのに、毎回ほぼ同じ内容を入力させるので フォーム入力の省力化として利用している。
  • hp さんの iLO や日立さんストレージ、F5 さんのBIG-IP みたいな web 画面から設定変更するような機器の 自動構築なんかもできそう。
    • スクリーンショットも撮れるので、エビデンスもついでに取得可能。
    • vCenter とかも操作できないかという思惑はある。
    • AWS とかも操作できるけど、そもそも API が豊富に備わっているから不要か。
  • あえて selenium を使わなくてもいいけど、クローリングやスクレイピングとかもできる

この selenium は、Java や Python, Ruby などのプログラミング言語からシナリオ操作が可能で ループ処理などするにはめちゃくちゃ便利。

いままでは Firefox プラグインだけで利用していたが、Ruby と絡めると便利すぎて感謝しかなかった。 ここでは、サンプルとして、はてなブックマークのホットエントリトップ5を一括で開くことを やってみたい。

ちなみに似たツールに iMacro がある。

関連記事: seleniumノウハウ

環境は、以下。

モノ バージョン
OS Windows 8.1 Pro
ブラウザ Firefox ESR 38.6.1
Selenium IDE 2.9.0
Ruby 2.2.4p230 (2015-12-16 revision 53155) [x64-mingw32]
gem selenium-webdriver (2.52.0)

準備

Windows に Rubyをインストールする。

RubyInstaller の RubyInstallers からインストーラをダウンロードし、実行する。 インストール時、 PATH を通すチェックボックスにチェックを入れる。

続いてDevelopment Kitをインストールする。この辺を参考に。 これも RubyInstaller の Development Kit からダウンロードして、解凍する。 解答したファイルに dk.rb があるのでコマンドプロンプトから以下のように実行する。

1
2
3
> cd {DEVELOPMENT KIT の解凍ディレクトリ}
> ruby dk.rb init
> ruby dk.rb install

次に、selenium-webdriver をインストールする。 Ruby をインストールしたことで、一緒に gem も使えるようになっているはずなので、 コマンドプロンプトから以下を打鍵。

1
> gem install selenium-webdriver

インストールの確認。irb (もしくは pry) とかで require できることを確認する。

1
2
3
>irb
irb(main):001:0> require "selenium-webdriver"
=> true

はてなホットエントリのトップ5エントリーを開く

ここではサンプルとして、はてなブックマークのホットエントリからトップ5 をブラウザで 次々に開くよう hatena.rb を書く。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
require "selenium-webdriver"

class Hatena
  def initialize
    # ブラウザの起動
    @driver = Selenium::WebDriver.for :firefox

    # ベース URL
    @base_url = "http://b.hatena.ne.jp"
  end

  def open_top5
    # ベースURL を開く
    @driver.get(@base_url + "/hotentry")

    # CSS セレクタで要素を特定してクリックする
    5.times { |i|
      @driver.find_element(:css, "a[data-entryrank='#{i + 1}']").click
      sleep 1
    }
  end
end

if __FILE__ == $0
  hatena = Hatena.new
  hatena.open_top5
end

コマンドプロンプトからこのスクリプトを実行すると次々とブラウザが起動してくる。

1
> ruby hatena.rb

こんな感じ。

hatena_screenshot

find_element メソッドは、CSSセレクタやxpath、タグ名、タグのID、class名などを指定できる。

フォームになにか値を突っ込みたいときは、@driver.find_element(~~~~~).send_keys "VALUE" みたいな感じで 要素を特定したあと、send_keys で文字列を渡してあげればよい。 POST は、ボタンを find_element してあげて.click (.submit でも良さ気) でOK。

スクリーンショットを撮るときは、@driver.save_screenshot "./screenshot.png" みたいな感じ。

参考

Comments