Help us understand the problem. What is going on with this article?

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

tomerun
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした