12
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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
10
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
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?