Ubuntu Server + ruby + firefox webdriver

# GUIのないサーバ上でSeleniumを実行

ガンガン既出の情報ですが…。
銀行口座の情報を自動で連携するためにやってみました。(OFXで連携)

## 環境情報
```
Ubuntu 12.04
ruby 2.0.0
```
サーバではRails 4.0が稼働中

## エラー
CUIのみのサーバーなので実行しようとするともちろん

```
Selenium::WebDriver::Error::WebDriverError: unable to obtain stable firefox connection in 60 seconds (127.0.0.1:7055)
	from /home/user/.rvm/gems/ruby-2.0.0-p247/gems/selenium-webdriver-2.50.0/lib/selenium/webdriver/firefox/launcher.rb:90:in `connect_until_stable'
	from /home/user/.rvm/gems/ruby-2.0.0-p247/gems/selenium-webdriver-2.50.0/lib/selenium/webdriver/firefox/launcher.rb:55:in `block in launch'
	from /home/user/.rvm/gems/ruby-2.0.0-p247/gems/selenium-webdriver-2.50.0/lib/selenium/webdriver/common/socket_lock.rb:43:in `locked'
	from /home/user/.rvm/gems/ruby-2.0.0-p247/gems/selenium-webdriver-2.50.0/lib/selenium/webdriver/firefox/launcher.rb:51:in `launch'
	from /home/user/.rvm/gems/ruby-2.0.0-p247/gems/selenium-webdriver-2.50.0/lib/selenium/webdriver/firefox/bridge.rb:43:in `initialize'
	from /home/user/.rvm/gems/ruby-2.0.0-p247/gems/selenium-webdriver-2.50.0/lib/selenium/webdriver/common/driver.rb:53:in `new'
	from /home/user/.rvm/gems/ruby-2.0.0-p247/gems/selenium-webdriver-2.50.0/lib/selenium/webdriver/common/driver.rb:53:in `for'
	from /home/user/.rvm/gems/ruby-2.0.0-p247/gems/selenium-webdriver-2.50.0/lib/selenium/webdriver.rb:86:in `for'
	from /home/user/rails/hal.mu/app/controllers/concerns/download_ofx.rb:20:in `execute'
	from (irb):2
	from /home/user/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands/console.rb:90:in `start'
	from /home/user/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands/console.rb:9:in `start'
	from /home/user/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands.rb:64:in `<top (required)>'
	from bin/rails:4:in `require'
	from bin/rails:4:in `<main>'
```
こんな感じのエラーに…。

## 必要なもの
仮想のディスプレイとして働く xvfb をインストールします。

```bash
sudo apt-get install xvfb -y
```

さらに、いちいち起動するわけにもいかないので headless もインストール

```
gem install headless
```

## 実行するソース
三井住友銀行 SMBCダイレクトにログインしたうえで一つの口座のOFXファイルをダウンロードします。
ログインと口座選択に必要な情報はDBから取得するようにしています。

```ruby:app/controllers/concerns/download_ofx.rb
require "selenium-webdriver"

module DownloadOfx
                                                                                                                                                                    
  def execute
    @headless = Headless.new(dimensions: "1920x1080x24")
    @headless.start
    # headlessはデフォルトで99
    `export DISPLAY=:99`
    profile = Selenium::WebDriver::Firefox::Profile.new
    profile['intl.accept_languages'] = "ja"
    profile['general.useragent.locale'] = "ja-JP"
    profile['browser.download.dir'] = "/tmp/selenium-webdriver"
    profile['browser.download.folderList'] = 2
    profile['browser.helperApps.neverAsk.saveToDisk'] = 'application/x-ofx'
    @driver = Selenium::WebDriver.for :firefox, :profile => profile
    @base_url = "https://direct.smbc.co.jp"
    @accept_next_alert = true
    @driver.manage.timeouts.implicit_wait = 30
    @verification_errors = []

    # 情報をDBから取得
    # ログインID 前半
    bank_account_userid1 = ConstantValue.where(:key => 'bank_account_userid1').first.value
    # ログインID 後半
    bank_account_userid2 = ConstantValue.where(:key => 'bank_account_userid2').first.value
    # 暗証番号
    bank_account_pin = ConstantValue.where(:key => 'bank_account_pin').first.value
    # 口座リンクのラベルテキスト
    bank_account_label = ConstantValue.where(:key => 'bank_account_label').first.value

    # ログイン画面を開く
    @driver.get(@base_url + "/aib/aibgsjsw5001.jsp")
    @driver.find_element(:id, "USRID1").clear
    @driver.find_element(:id, "USRID1").send_keys bank_account_userid1
    @driver.find_element(:id, "USRID2").clear
    @driver.find_element(:id, "USRID2").send_keys bank_account_userid2
    @driver.find_element(:id, "PASSWORD").clear
    @driver.find_element(:id, "PASSWORD").send_keys bank_account_pin
    @driver.find_element(:name, "bLogon.y").click
    # 口座を開く
    @driver.find_element(:link, bank_account_label).click
    # OFXファイルのダウンロード
    @driver.find_element(:id, "DownloadOFX").click
    @driver.find_element(:link, "ログアウト").click
    @driver.find_element(:css, "input.formButtonNavi2.leftButton").click

    @driver.quit
    @headless.destroy
  end
end
```

これで無事にダウンロードできるようになりました。