フォームをテストするために Capybara をセットアップしようとしていますが、エラーが発生し続けます
cannot fill in, no text field, text area or password field with id, name, or label 'Name' found
これが私の見解です:
<%= form_for(@user) do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
...
<%= f.submit "Create Account", class: "btn btn-large btn-primary" %>
<% end %>
次の html をレンダリングします。
<label for="user_name">Name</label>
<input id="user_name" name="user[name]" size="30" type="text" />
したがって、ラベルに基づいてフィールドを見つける必要があるようです。
これが私の user_pages_test.rb ファイルの内容です (私は Test::Unit と shoulda-context を使用しています):
context "sign up page" do
should "add user to database when fields are filled in" do
fill_in "Name", with: "Bubbles"
...
click_button "Create Account"
end
end
これが私がこれまでに試したことです:
1) への呼び出しをfill_in
id に一致するfill_in "user_name", with: "Bubbles"
ように変更する 2)ドキュメントの例に一致するようにfill_in
への呼び出しを変更する 3) ビューを変更して、手動で IDを
追加する(この回答)
4) への呼び出しを変更する(場合に備えて)ルーティングの問題でした) page.fill_in "Name", with: "Bubbles"
"Name"
<%= f.text_field :name, id: "Name" %>
get sign_up_path
get "/sign_up"
これらすべてでまだ同じエラーが発生するため、何らかの理由でページが正しく読み込まれていないと思われます。ただし、ページのタイトルが正しいことをアサートする同じコンテキストで別の (合格した) テストがあるため、ページが正しく読み込まれることがわかります (でsetup
)。
これに基づいて(およびこのfill_in
回答によると)、フィールドにアクセスしようとする前にメソッドがページのロードを待っていないことが問題のようです。この提案に従って、テストに行を追加してputs page.body
、フィールドに入力しようとする前に HTML が完全にロードされていることを確認し、次の出力を得ました。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
fill_in
だから、ページが読み込まれるのを待っていなかったと確信していました. 私はそれから試しました
5)この回答Capybara.default_wait_time
に従って変更しましたが、これは効果がありませんでした。test_helperファイル(Capybaraが含まれている場所) のクラスと、テスト自体に設定してみました。ActionDispatch::IntegrationTest
puts page.body
次に、合格テスト (正しいタイトルをアサートする前後の両方) を追加してみましたが、同じ出力が得られました。THEN、私はこの答えを見つけ、最終的にコンソールにページの HTML を出力させました。カピバラにフィールドを入力させるために、もう 1 つ試してみました。
6) 呼び出しをfill_in
say@response.fill_in
に変更しました。これは、変数が本来 @response
行うべきだと思っていたことを実行しているように見えるためです。page
だから、私はこれについて2つの質問があります:
1)page
変数は実際に何を参照していますか? 私のアプリの doctype 宣言は だけ<!DOCTYPE html>
なので、古いものをどこから取得するのかわかりません。
2) Capybara がこれらのフィールドを検索/入力できないのはなぜですか?