[Ruby] Capybara + Poltergeist(PhantomJS)でデータ取得できなった時の対応(SSLエラー)

Rubyで、Capybara + Poltergeistを使ってデータを取得する際に、エラーが出て取得できない時の対処方法です。

症状

これまで普通に動いていたのに、ある日突然サイトによって全くデータ取得ができなくなる現象に遭遇しました。

PhantomJSのバージョンを変えたり、Ubuntu本体の方法をアップデートしたり、ヘッドレスChromeを使ってみたり、いろいろ試したところ、、、

・サイトによって取得できたり、できなかったりする
・取得できないのは、AWS EC2で構築されたサーバーが多い
・ヘッドレスChromeで試してみたところ、cert関連のエラーが続出していた

なんか、CloudFrontのSSLとかその辺が怪しいなぁと思っていたところ、下記の記事を発見。

SSL のハンドシェイクでしくってるのでなにも取得できてなかったというわけで下記のようにすることで解決するようです。

Capybara と Phantomjs で ChatWork をアレしようと思ったら Capybara::Poltergeist::StatusFailError とかいわれてなにも取得できなくて困った。

結論から言うと、こちらの方の解決方法でバッチリでした。

もともとのコードと改善方法

もともとのコード

もともとのコード動いていたコードは下記の通り。

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, {:js_errors => false, :timeout => 2000 })
end

Capybara + Poltergeistを紹介するサイトによくある例のままですね。

改善後

さて、さきほどのサイトさんの方法そのままですが、改善後はこちら。

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app,{
                js_errors: false,
                timeout: 1000,
                #debug: true, //デバックを表示したいときのみ
                phantomjs_options: [
                          '--load-images=no',
                          '--ignore-ssl-errors=yes',
                          '--ssl-protocol=any']})
end

phantomjs_optionsという引数を追加しました。

SSL関連のエラーを無視する感じですね。


丸一日調べましたが、結局、Poltergeistの引数を追加するだけで修正が完了しました!先のサイトの筆者の方に感謝!

余談ですが、普段からPHP関係の記事が多い私ですが、実はRubyも好きな言語だったりします(実は人生初プログラミング言語はRuby)。