Michael HartlのRuby on Railsチュートリアルです。rspec/ capybaraを使用すると、fill_inメソッドが混乱します。以下のビューコードがあります。
<%= f.label :name %>
<%= f.text_field :name %>
これは私のテストコードです:
fill_in "Name", with: "Example User"
Fill_inが入力フィールドを見つけるには、labelとtext_fieldの両方が必要なようです。 f.label
を外すか、<%= f.text_field :name %>
を<%= f.text_field :another_name %>
に変更すると、テストでElementNotFound
エラーが発生します。誰かがここでfill_inがどのように機能するか説明できますか? fill_in
メソッドには入力フィールドとラベルの両方が必要ですか?
fill_in
がフィールドname
、id
またはラベルテキストを検索するのは stated です。 Railsガイドの ActionView :: Helpers :: FormHelper セクションによると、質問するビューコードは次のHTMLコードに変換する必要があります。
# I assume that you made a form for a @user object
<label for="user_name">
Name
</label>
<input id="user_name" name="user[name]" type="text" />
ご覧のように、label
はfill_in
式の内部で要求する「名前」テキストを生成しました。ただし、id
フィールドのname
プロパティとinput
プロパティは少し異なるため、同じ結果を得るにはid
ベースのセレクターを使用する必要がありました。
fill_in "user_name", with: 'Example User'
つまり、label
フィールドは必須ではありませんが、htmlコードを注意深く監視し、fill_in
式に適切なパラメーターを選択する必要があります。
2つのネガティブが投稿したものに追加するだけです。 capybara docsがfill_in()メソッドに対して言っていることは次のとおりです。
フィールドは、その名前[属性]、ID [属性]、またはラベルテキストで見つけることができます
http://rubydoc.info/github/jnicklas/capybara/Capybara/Node/Actions:fill_in
「名前」ラベルを削除すると、次のいずれかを使用でき、テストは引き続き成功します。
fill_in 'user_name', with: "Example User" #locate text field by id attribute
fill_in :user_name, with: "Example User" #locate text field by id attribute
fill_in 'user[name]', with: "Example User" #locate text field by name attribute
fill_in :'user[name]' with: "Example User" #locate text field by name attribute
Rubyでは、記号全体を引用符で囲まないと、記号名に使用できない文字があります。
カピバラは、ページからすべてのテキストフィールド(またはテキスト領域)を取得し、次にidおよびname属性の値を取得し(Nokogiriなどで簡単に実行できます)、いずれかの値がfill_in()の最初の引数と等しいかどうかを確認する必要があります(最初の引数をto_s()を介して文字列に変換した後)。
私はここに2セントを提供しました: カピバラはフォーム要素を見つけられません 。
Rails text_field helper with underscore(:first_name))を呼び出すと、DOMは「First name」としてレンダリングされ、Capybaraが必要とするものになります。id属性は不要です。
見る: <%= form.text_field :first_name %>
テスト:fill_in "First name", with: 'Elaine'