カピバラを使用してフォームフィールドが正しく事前入力されていることを確認するにはどうすればよいですか?


145

カピバラで問題なく記入できる適切なラベルのあるフィールドがあります:

fill_in 'Your name', with: 'John'

入力する前に値を確認したいのですが、わかりません。

fill_in次の行の後に追加した場合:

find_field('Your name').should have_content('John')

そのテストは失敗しますが、ページを保存することで確認したように、直前の入力は機能しました。

何が欠けていますか?

回答:


179

xpathクエリを使用inputして、特定の値( 'John'など)の要素があるかどうかを確認できます。

expect(page).to have_xpath("//input[@value='John']")

詳細については、http://www.w3schools.com/xpath/xpath_syntax.aspを参照してください

おそらくもっときれいな方法:

expect(find_field('Your name').value).to eq 'John'

編集:今日私はおそらくhave_selectorを使用するでしょう

expect(page).to have_selector("input[value='John']")

ページオブジェクトパターンを使用している場合(使用する必要があります!)

class MyPage < SitePrism::Page
  element :my_field, "input#my_id"

  def has_secret_value?(value)
    my_field.value == value
  end
end

my_page = MyPage.new

expect(my_page).to have_secret_value "foo"

ああ、.value少し欠けていました。ありがとう!
マルク=アンドレ・Lafortune

私は同じ問題を抱えていましたが、フォームフィールドではなくdivがありました。同じ問題を抱えている他の人には、find_field()。valueではなくfind_by_id()。textを使用してください。その値がフォームフィールドでのみ機能することに気づくのに年齢を要しました…
John Y

8
後者の方法の問題は、カピバラのポーリングサイクルを使用しないため、フィールドが実行時間の長いJSコードによって設定された場合、即座に失敗することです。最初の方法は、静的に生成されたフォームでこれを試していない限り、推奨されます。
fqxp 2013年

1
@fqxpには、RSpecマッチャーと新しい期待構文を使用するより良い答えがあると思います。ドキュメントで見たものからfind_field、その他Node::Findersはノードを見つけて期待よりもアクションを実行するために使用されます。もちろん、これは規則ではありませんが、組み込みのソリューションを使用するのはより良いアイデアなので、単純なものにはこれを使用します。ただ言って!
Agent47DarkSoul 2013年

確かに、今は望ましい方法ですが、その構文はこの質問の約1か月後にリリースされました。
DVG 2013年

309

別のかなりの解決策は次のとおりです。

page.should have_field('Your name', with: 'John')

または

expect(page).to have_field('Your name', with: 'John')

それぞれ。

参照も参照してください

:無効な入力の場合は、オプションを追加する必要がありますdisabled: true


23
選択した回答よりもはるかに優れています!
Agent47DarkSoul 2013年

3
エラーメッセージには予想される文字列と実際の文字列が表示されるため、選択した回答を使用することをお勧めします。これにより、役に立たない「予期されたフィールド "my field"が何かを返す」エラーが発生します。しかし、これは間違いなく読みやすく、ページマッチャーAPIをより適切にフォローします。周りの賛成票!
mraaroncruz 2014年

1
私の知る限り、これは実際にはフィールドの値を確認するのではなく、値に関係なくフィールドの存在を確認するだけです。ドキュメントは値に基づいてフィルタリングするべきだと言っているので、それはバグだと思います。
Nick

1
with確かに渡すと、値が一致した場合にのみtrueが返されました。
Ben Saufley、2014

4
おそらく回答が最初に書かれて以来、エラーメッセージは改善されているかもしれませんexpected […] but there were no matches. Also found "", which matched the selector but not all filters..が、今では非常に素晴らしいエラーメッセージに非常に近い空のフィールドが表示されます。
Patru、2014

2

プレースホルダーをテストする場合は、以下を使用します。

page.should have_field("some_field_name", placeholder: "Some Placeholder")

または:

expect(page).to have_field("some_field_name", placeholder: "Some Placeholder")

ユーザーが入力した値をテストする場合:

page.should have_field("some_field_name", with: "Some Entered Value")

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.