CapybaraにAlertのOKを押させる

ruby_gems.jpg

RailsのテストをRspecで書いていたんですが、CapybaraのJS周りで思いっきりハマりました。
ちなみに環境は、CentOS 6.5, Rails4.1, Rspec3.3, capybara2.5

rails でlink_toに
data: { confirm: “MCハマーですか?” }
入れると、テストの中でもAlertでOKを押させるようにしないとテストが進まないですよね。
なので、
page.driver.browser.switch_to.alert.accept
でOKするっていう話をネットで散見したのですが、

     Failure/Error: page.driver.browser.switch_to.alert.accept
     NoMethodError:
       undefined method `switch_to' for #<Capybara::RackTest::Browser:0x007f724451ad98>

と、怒られました。

webドライバー変更への道

capybaraが入ってるので勝手にwebdriverでJS動かしてくると思ってたんですが どうも違うようでした。
capybaraでseleniumを動かせるのは動かせるようですが、重いみたいで いま巷のイケてる人達はpoltergeistとかいうドライバーを使っているみたいです。
とか、書いてて思い出したんですが今年の夏にヘルプで手伝ってたRailsの案件で社外の敏腕エンジニアの人も使ってたな。。

さて、このポルターガイストとかいう物騒な名前のドライバーを動かすにはどうすればいいのか調べますと
gem ‘poltergeist’ をして bundle install
後、spec_helperで

  Capybara.register_driver :poltergeist do |app|
    Capybara::Poltergeist::Driver.new(app, :inspector => true)
  end
  Capybara.javascript_driver = :poltergeist

でいけるようです。

ところが、この設定で動かしても
undefined method `switch_to’ for #Could not find an executable [“phantomjs”] on your path.

と怒られました。

実行環境にphantomjsというライブラリが入ってないとダメみたいです。
そして、先ほどチラっと書いた通り 今年の夏に全く同じ状況になってphantomjs入れてたわ俺

けど、その時もCentOSつかってたのに今日はぜんっぜん一発で入らない

ところで、phantomjs って何なの?

Phantomjsをインストールする

最初参考にした記事
https://blog.supersonico.info/?p=1054

phantomjs をgithubからcloneしてきて、gitのブランチを1.9に変更するのが重要。

$ git branch 1.9
./build.sh

最初、他のサイトみたとき書いてなくてて、 ./build.py が動かなくて焦ってた。

ところが、これをやってみると
cannot find -lQtWebKit
で怒られてError終了する

そして、この lQtWebKitとかいうヤツなんなのか全然良くわからない。 時間ない。 最近何故か無駄に遅い時間に会社残れないからこれ以上時間かけられない。
わい、詰んだかもしれない

そう思っていたら、Linux用バイナリがTarで配布されている事を発見
http://blog.tokoyax.com/entry/js/phantomjs-install

ありがてぇ。ありがてぇ。 これでphantomjsを入れる事ができました。

さて、改めて bundle exec rspec パチコンしてみますと。

undefined method `switch_to' for #<Capybara::Poltergeist::Browser

ファッ?!(?_?)

ここであらためて、今日散々見たサイトの文章をチェックしますと
https://github.com/teampoltergeist/poltergeist/issues/80#issuecomment-6237980

>Poltergeist always returns true for a call to window.confirm. There’s no way to make it return false (at the moment), but it should not prevent your test from running.

だ、そうで
page.driver.browser.switch_to.alert.accept
をそもそも書かなくてよいそうです!!

そして、 :js => true も書かなくて通ったわ。

テスト通った!! ヒャッホー!!! (゚∀゚)

 

2015-12-02 | Posted in RailsNo Comments » 


関連記事

Comment





Comment



*