WatirでPhantomJSを使うときに出るエラー

PhantomJSでWatir(正確にはWatir WebDriver*1およびその中で働いているSelenium WebDriver)を使ってWebアクセスするとき、1回だけならばエラーが出ないのだけど、ループ処理など繰り返しPhantomJSとWatirを使うと時々PhantomJSが動かなくなるときがある。これにより Selenium::WebDriver::Error::WebDriverError エラーが出る。

unable to connect to phantomjs @ http://127.0.0.1:8910 after 20 seconds 
/app/vendor/bundle/ruby/1.9.1/gems/selenium-webdriver-2.42.0/lib/selenium/webdriver/phantomjs/service.rb:47:in `start' 
/app/vendor/bundle/ruby/1.9.1/gems/selenium-webdriver-2.42.0/lib/selenium/webdriver/phantomjs/bridge.rb:20:in `initialize' 
/app/vendor/bundle/ruby/1.9.1/gems/selenium-webdriver-2.42.0/lib/selenium/webdriver/common/driver.rb:45:in `new' 
/app/vendor/bundle/ruby/1.9.1/gems/selenium-webdriver-2.42.0/lib/selenium/webdriver/common/driver.rb:45:in `for' 
/app/vendor/bundle/ruby/1.9.1/gems/selenium-webdriver-2.42.0/lib/selenium/webdriver.rb:67:in `for' 
/app/vendor/bundle/ruby/1.9.1/gems/watir-webdriver-0.6.9/lib/watir-webdriver/browser.rb:46:in `initialize' 

対策としてはこういう感じにrescueでretryする。
ついでに、ループ処理の最後には@browser.quitしてSelenium::WebDriver.for(:phantomjs).quitしておくとメモリを喰わなくて済む。

require 'watir-webdriver'

def main
  begin
    @browser = Watir::Browser.new(:phantomjs)
  rescue Selenium::WebDriver::Error::WebDriverError => ex
    puts ex.inspect
    sleep 1
    retry
  end
 :
(@browserを使った処理)
 :
ensure
  @browser.quit
  Selenium::WebDriver.for(:phantomjs).quit
end

loop do
  main
  sleep 300
end

関連リンク:PhantomJSとSelenium/Watirを使っているherokuでCyclingなどの際にConnection refusedエラーが出てウザイ - 別館 子子子子子子(ねこのここねこ)

*1:今はもうWatirにまとめられた。