読者です 読者をやめる 読者になる 読者になる

scramble cadenza

技術ネタのガラクタ置き場

Capybara::Poltergeist で remote debug が動かない件

イントロ

タイトルの通り。Capybara::Poltergest の目玉機能である remote debugging がうまく動作しなくて、色々試行錯誤した話。

https://github.com/teampoltergeist/poltergeist#remote-debugging-experimental

環境

  • OSX 10.10.3
  • phantomjs 2.2.0
  • poltergeist 1.6.0
  • chromium 45.0.2411.0

remote debugging とは

poltergeist の README に書いてあるとおり

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, js_errors: false, inspector: true)
end

@session = Capybara::Session.new(:poltergeist)

@session.visit url
@session.driver.debug

のような感じで、driver.debug のタイミングでブラウザを起動し、debug できる機能らしい。

使い方は簡単で

  • Capybara::Poltergeist::Driver.newinspector: true オプションを渡す
  • driver.debug を呼ぶ

だけで良い。

苦戦した所

1. そもそもブラウザ起動しない

# @session.driver.debug を使った spec を実行させる
bundle exec rspec 
...

Poltergeist execution paused. Press enter to continue.
The file //localhost:9664 does not exist.

てっきり chrome か何かが自動で起動するんだろうなぁと思ってたが、file //localhost:9664 がないと言われて怒られてしまう。

解決法

微妙なアプローチだけど、chromium を install して回避してみた。

brew install Caskroom/cask/chromium
ln -s /opt/homebrew-cask/Caskroom/chromium/latest/chrome-mac/Chromium.app/Contents/MacOS/Chromium /usr/local/bin/chromium

として、chromium コマンドをむりやり PATH に追加。
これだけで良い。

というのも、ブラウザ起動の仕組みは単純で、 chromium chromium-browser google-chrome のいずれかのコマンドが PATH に通ってれば実行される、というものだから。

https://github.com/teampoltergeist/poltergeist/blob/9b73d618688c5cbdeaea600a193a514c58a754e6/lib/capybara/poltergeist/inspector.rb#L3

chromium http://www.google.co.jp

と叩いて chromium が起動して google トップページが表示されるならOKなはず。

google-chrome コマンドがどうやら linux 環境でのコマンドというのと、macgoogle-chrome コマンドに相当するものを見つけられなかったので、こんな感じになりました。

Check failed: feature. と言われて起動できない。

ところが上記をやっても解決しない。
chromium が動こうとするのだが、以下の様なエラーが出て、chromium が起動できない。

Poltergeist execution paused. Press enter to continue.
[86324:1299:0524/032749:ERROR:component_loader.cc(154)] Failed to parse extension manifest.
[86324:1299:0524/032749:ERROR:component_loader.cc(154)] Failed to parse extension manifest.
[86324:1299:0524/032749:ERROR:component_loader.cc(154)] Failed to parse extension manifest.
[86324:1299:0524/032749:ERROR:component_loader.cc(154)] Failed to parse extension manifest.
[86324:1299:0524/032749:ERROR:component_loader.cc(154)] Failed to parse extension manifest.
[86324:1299:0524/032749:ERROR:component_loader.cc(154)] Failed to parse extension manifest.
[86324:1299:0524/032749:ERROR:component_loader.cc(154)] Failed to parse extension manifest.
[86324:1299:0524/032749:ERROR:component_loader.cc(154)] Failed to parse extension manifest.
[86324:1299:0524/032749:ERROR:component_loader.cc(154)] Failed to parse extension manifest.
[86324:1299:0524/032749:FATAL:feature_provider.cc(75)] Check failed: feature. FeatureProvider 'behavior' does not contain Feature 'whitelisted_for_incognito'

色々調べてみたがよくわからない。
chromiumソースコードにそれっぽいものを発見して、右往左往したけど挫折。

解決法

これは 予め chromium を起動した状態で、@session.driver.debug を実行する と回避できる。

要するに chromium 起動させて rspec 叩くわけです。

すると

f:id:mgi:20150524035806p:plain

のように file:///localhost:9664 を開こうとしているから、file:/// を消してエンター。

f:id:mgi:20150524035816p:plain
URL があらわれた。URL をクリック。

f:id:mgi:20150524035831p:plain

無事コンソール画面へ

まとめ

溢れんばかりのバッドノウハウ感。
poltergiest の experimental な feature なので、参考になれば。

google-chrome 使うことができれば、妙なエラーはでない?のかもしれない。

みんなどうやってるの...