カピバラでは、次のようなことができることを知っています。
page.should have_css("ol li", :count => 2)
ただし、ページに一致する要素が1つしかない場合、エラーはあまり説明的ではありません。
1) initial page load shows greetings
Failure/Error: page.should have_css("ol li", :count => 2)
expected css "ol li" to return something
このかなりあいまいなエラーメッセージの代わりに、エラー出力が「 'ol li'に一致するとき:予想:2、見つかった:1」などのような方法でアサーションを記述する方法があります。明らかに、このような動作のために自分でカスタムロジックを作成することができます。
それが価値があるものとして、私はSeleniumドライバーとRSpecを使用しています。
私はこれがずっと好きです。
expect(page).to have_selector('input', count: 12)
すぐに使用できるサポートはないように見えるので、このカスタムマッチャーを作成しました。
RSpec::Matchers.define :match_exactly do |expected_match_count, selector|
match do |context|
matching = context.all(selector)
@matched = matching.size
@matched == expected_match_count
end
failure_message_for_should do
"expected '#{selector}' to match exactly #{expected_match_count} elements, but matched #{@matched}"
end
failure_message_for_should_not do
"expected '#{selector}' to NOT match exactly #{expected_match_count} elements, but it did"
end
end
これで、次のようなことができます。
describe "initial page load", :type => :request do
it "has 12 inputs" do
visit "/"
page.should match_exactly(12, "input")
end
end
次のような出力を取得します。
1) initial page load has 12 inputs
Failure/Error: page.should match_exactly(12, "input")
expected 'input' to match exactly 12 elements, but matched 13
それは今のところトリックをします、私はカピバラのこの部分を作ることを検討します。
次の方が簡単で、かなり明確な出力が得られ、カスタムマッチャーの必要がなくなると思います。
page.all("ol li").count.should eql(2)
これはエラー時に出力されます:
expected: 2
got: 3
(compared using eql?)
(RSpec::Expectations::ExpectationNotMetError)
編集: @ThomasWalpoleが指摘したように、all
を使用すると、Capybaraの待機/再試行が無効になるため、@ pandaPowerによる上記の回答の方がはるかに優れています。
これはどう?
within('ol') do
expect( all('.opportunity_title_wrap').count ).to eq(2)
end
カピバラが推奨する現在の(2013年9月2日)ベストプラクティスは次のとおりです( source ):
page.assert_selector('p#foo', :count => 4)