LoginSignup
12
9

More than 3 years have passed since last update.

Rspec 複数のselectタグのテストを実行する時の注意

Posted at

テストを実行したい該当のコード

ツアー情報を投稿する際に、ジャンルを選択して保存するようにさせている。
selectタグでvalueが1のoptionを選択してジャンルを保存するテストをやってみたい
スクリーンショット 2020-07-01 15.45.03.png

とあるページを参考にHTMLに表示される内容(以下だと冒険)を入力してテスト走らせてみた。

tour_spec.rb
it 'tour投稿に成功する' do
  select '冒険', from: 'tour[genre_id]'
end

ハマったエラー

Failure/Error: select '冒険', from: 'tour[genre_id]'
     Capybara::ElementNotFound:
       Unable to find option "冒険" within #<Capybara::Node::Element tag="select" path="/HTML/BODY[1]/DIV[1]/DIV[1]/DIV[1]/DIV[1]/FORM[1]/DIV[3]/DIV[1]/TABLE[1]/TBODY[1]/TR[1]/TD[2]/SELECT[1]">

冒険なんて見つからへんぞってめちゃくちゃ怒られた。
ここで、「やはりvalueを指定してやらないと、できないのではないか???」と、疑い始める。

select '', from: '' じゃなくても実現できるみたい

find("option[value='<該当するvalueの値>']").select_option

修正して実行してみる

Failure/Error: find("option[value='1']").select_option
     Capybara::Ambiguous:
       Ambiguous match, found 2 elements matching visible css "option[value='1']"

しかし、またキレられた。
なんやら要素が2つあるから特定できひんやんけ!!!!って吠えている

このエラーの原因はもう1つのselectが存在しているからみたいだ。実はジャンル以外にもう1つ、都市を選択するselectタグが存在している
スクリーンショット 2020-07-01 17.53.46.png

どのselectタグなのか指定してやる

Rspecパイセンがどのselectと立ち向かえばいいか迷わないように、selectタグにあるidを指定してやる。

tour_spec.rb
find("#tour_genre_id").find("option[value='1']").select_option
find("#tour_city_id").find("option[value='1']").select_option

無事にぶっ倒しました。経験値5000ぐらい得た気する

メモメモ

fill_inやselectは便利やけど、どうやら不安定なことも多いみたい。。。
今回のようにfindで要素を特定して、入力する書き方の方が安全だったり、そうだったり、ラジバンダ、、、。
通っていたテストが時々通らなかったりするのは不安定なことが原因にあるのかよ。知らんかった時はいつもめちゃくちゃ悩んでいたのに

12
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
9