先日rspec+capybaraでのE2Eテストでjavascriptのエンジンをpoltergeistを使うことにしました。

そして、javascriptのconfirmダイアログのOKを押そうとしたら

NoMethodError:
  undefined method `switch_to'

というエラーが発生した🙅 こっから簡単に解決できなくて少し辛い時間をすごした。

とりあえずテストしたかった部分のviewは、

<%= link_to 'ほげほげするボタン', foo_path, data: {confirm: "ほげほげしますか?"}, id: 'foo_button' %>

という簡単な物。data: {confirm: ''}でシンプルにダイアログだしてるので簡単にできるはずなんだけど……。

調べてみると、poltergeistはアラートが出たら自動的にOKを押すようになっていると書いてある。が、どうみてもOKを押した時の動作にならない。sleepを入れてみても変化なし。

page.accept_confirm 'ほげほげしますか?' do
    click_button('OK')
end

とか書いてもダメ。スクリーンショットを撮ってみると、そもそもconfirmダイアログが出ていないように見える。えー……😵 ここでjavascriptで変な処理書いてないか調べるもやっぱり何もしていない。

で、ソースとドキュメントを見て、最終的にaccept_confirmに引数にクリックさせたい要素を渡せば無事思い通りの動作になった。

page.accept_confirm {click_on 'foo_button'}

ふぅーなんか手こずった。スクリーンショットで見ても次の動作に行ってるし、無事テストが通りました 🙆