Edited at

RubyでSeleniumを使ってスクレイピング

More than 3 years have passed since last update.

JavaScriptバリバリなページはNokogiriなどのスクレイピングツールで扱うのが難しいですが、Seleniumでブラウザ自動操作すると大体のものはできるようになるので、使い方をまとめておきます。

Javaから使うのと比べて、Rubyバインディングだとずいぶんシンプルで良かったです。


リファレンス

http://selenium.googlecode.com/svn/trunk/docs/api/rb/frames.html

【2015-11-12 追記】上記のリンクは更新停止しているようなのでこちらを見たほうが良さそうです

http://www.rubydoc.info/gems/selenium-webdriver/


使い方

gemをインストールする。

gem install selenium-webdriver

seleniumなんちゃらというgemがたくさんあるけどこれだけでよい。

コード内で require 'selenium-webdriver' すれば使えるようになる。


起動と終了

driver = Selenium::WebDriver.for :firefox # ブラウザ起動

driver.quit # ブラウザ終了

:firefox のところは :ieとか:chromeとか:operaとか好きなのを


ページ、フレーム移動

driver.navigate.to 'http://example.com' # URLを開く

driver.switch_to.frame(1) # 1つめの子フレームに移動
driver.switch_to.frame("frameid") # フレームのnameを指定して移動


要素を指定

element = driver.find_element(:name, 'calendar')        # nameで指定

element = driver.find_element(:id, 'calendar') # idで指定
element = driver.find_element(:class, 'right_box') # classで指定
element = element.find_element(:tag_name, 'table') # 要素名で指定
element = element.find_element(:xpath, 'tr[2]/td[3]/a') # XPathで指定
element = driver.find_element(:class, 'body').find_element(:name, 'form').find_elements(:xpath, './/input')[2] # メソッドチェーン

DriverとElementがどちらもfind_element・find_elementsメソッドを持っている。


入力

# テキストフィールドへ入力・削除

element = driver.find_element(:name, 'userId')
element.send_keys('username')
element.clear

# ドロップダウンリスト選択
select = Selenium::WebDriver::Support::Select.new(driver.find_element(:id, 'dropdown'))
select.select_by(:value, 'item1') # valueの値で選択
select.select_by(:text, 'どちらでもない') # 表示テキストで選択
select.select_by(:index, 2) # インデックス(0始まり)で選択

# ラジオボタン選択
driver.find_elements(:name, 'selectOne')[2].click

# リンクやボタンを押す
driver.find_element(:xpath, '//table[2]/tr[3]/td[1]/a').click


情報取得

# 要素の内容テキスト

puts element.text

# Firefoxでダウンロードのリンクを踏んだとき保存確認ダイアログを出さずに指定のフォルダに保存
profile = Selenium::WebDriver::Firefox::Profile.new
profile['browser.download.folderList'] = 2
profile['browser.download.useDownloadDir'] = true
profile['browser.download.dir'] = 'path/to/downloadFolder'
profile['browser.helperApps.neverAsk.saveToDisk'] = 'text/csv'
driver = Selenium::WebDriver.for :firefox, :profile => profile

# スクリーンショットを撮る
# !!private APIにつき動作保証なし!!
driver.save_screenshot('path/to/filename.png')


おわりに

ここにもう少し詳しく書いてあります(英語)

http://code.google.com/p/selenium/wiki/RubyBindings