web-dev-qa-db-ja.com

fill_inはRspec / Capybaraでどのように機能しますか?

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メソッドには入力フィールドとラベルの両方が必要ですか?

13
Joey Hu

fill_inがフィールドnameidまたはラベルテキストを検索するのは 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" />

ご覧のように、labelfill_in式の内部で要求する「名前」テキストを生成しました。ただし、idフィールドのnameプロパティとinputプロパティは少し異なるため、同じ結果を得るにはidベースのセレクターを使用する必要がありました。

fill_in "user_name", with: 'Example User'

つまり、labelフィールドは必須ではありませんが、htmlコードを注意深く監視し、fill_in式に適切なパラメーターを選択する必要があります。

20
twonegatives

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()を介して文字列に変換した後)。

5
7stud

私はここに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'

3
urubuz