capybaraにてテキストボックスに値を入力する場合、以下のように記述するのが普通だと思いますが
📄customers_spec.rb
fill_in 'Name', with: '山田 太郎'
第1引数に指定できるのは、ラベル文字列かDOMのidだけです。通常の単票フォームでは困ることはないのですが、複数モデルを一括入力をするようなフォームの場合はその限りではありません。なぜなら、ラベル文字列はユニークにできないし、idもcustomer_19887632_name
のようにオブジェクトのidが間に入ってしまうからです。
そんなときは、findメソッドであいまい検索をすればよいです。
📄capybara-spec
#完全に等しい find("img[src='https://www.example.com/image']") #含む find("img[src*='https://www.example.com/image']") #前方一致 find("img[src^='https://www.example.com/image']") #後方一致 find("img[src$='https://www.example.com/image']")
Railsのfields_for
を使っている場合、各DOMのidやnameに属性名が入るので、以下のようにマッチングさせることができます。
📄customers_spec.rb
# 例えば Locationモデルが has_many Customers だったとすると # # <input type="text" name="location[customers_attributes][123238098342][name]" ... # のようになるので # find("input[name$='[name]']").set("山田 太郎") find("select[name$='[gender]']").select("男") ...
set/selectで要素に値をセットできます。また複数の要素にマッチしてしまう場合は、
📄customers_spec.rb
find("input[name$='[name]']")[0].set("山田 太郎")
というふうにインデックスを指定してればよいです。
関連する記事
- chosen-railsによる検索機能付きセレクトボックスで、検索画面作成の手間を省く
- 【実践】Railsにて検索結果をそのままCSV出力する(やや手抜きで)
- capybaraを使ってWebページをスクレイピングする(テストじゃなくて)
- simple_formとTwitter bootstrapで作る俺流鉄板Railsアプリ(その1)
- 久しぶりにRailsで開発して感じたこと
ピンバック: capybara | mycoderepository