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エラーが出てウザイ - 別館 子子子子子子(ねこのここねこ)