capybaraで要素をあいまい検索して値をセットする


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']")

参考:StackOverflow

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("山田 太郎")

というふうにインデックスを指定してればよいです。

 

関連する記事


「capybaraで要素をあいまい検索して値をセットする」に1件のコメントがあります

  1. ピンバック: capybara | mycoderepository

コメントは受け付けていません。