Capybaraを使用して、フォーム要素が存在しないことをアサートする必要があります。たとえば、「「ユーザー名」テキストフィールドは表示されません」などです。要素が見つからない場合、findは例外をスローするので、これは私が思いついた最高の方法です。もっと良い方法はありますか?
Then /^I should not see the "([^\"]+)" ([^\s]+) field$/ do |name, type|
begin
# Capybara throws an exception if the element is not found
find(:xpath, "//input[@type='#{type}' and @name='#{name}']")
# We get here if we find it, so we want this step to fail
false
rescue Capybara::ElementNotFound
# Return true if there was an element not found exception
true
end
end
私はカピバラが初めてなので、明らかなことを見逃しているかもしれません。
Capybaras has_no_selector? rspecsマジックマッチャーと組み合わせたメソッド。その後、次のように使用できます。
page.should have_no_selector(:xpath, "//input[@type='#{type}' and @name='#{name}']")
実行できるアサーションの詳細は、カピバラのドキュメントページ here の「クエリ」というタイトルのセクションにあります
Capybaraマッチャーによって定義された既存のメソッドを実際に使用できます。
assert has_no_field?('Username')
さらに、ページ内のさまざまなタイプの要素を見つけるのに役立つ追加の方法が利用できます。
has_link? , has_no_link?
has_button?, has_no_button?
has_field?, has_no_field?
has_checked_field?, has_no_checked_field?
has_select?, has_no_select?
などなど 。 。 。
これが私が使っているものです:
expect(page).to have_no_css('.test')
Derek で提案された解決策を試しましたが、いくつかの偽陰性に遭遇しました。
あれは
page.should have_no_selector(:xpath, "//input[@type='#{type}' and @name='#{name}']")
なんらかの理由で失敗した場合でもパスします。
raise_error
のRSpec構文で成功しました
expect { find(:xpath, "//input[@type='#{type}' and @name='#{name}']") }.to raise_error
これはとにかくあなたが求めているものに近いと思います。だから私はこれを答えとして提示しました。
これを行う最善の方法は、要素を見つけて、それが存在しないことをアサートすることです。これは再利用可能なコードを作成するだけでなく、それが見つからない場合でもテスト全体が失敗することはありません。
これが私がすることです...
オブジェクトを定義する
def username
page.find('.username')
end
次に、スペックファイル内のオブジェクトを操作します
username.should be_true
要素がページ上にあるかどうかは、ほとんど気にする必要はありません(ほとんどの場合)。テストを作成しているときに気にするのは、その要素を操作できるかどうかです...そのため、最初にオブジェクトを定義し、次に 'username'を使用して操作します...再利用可能なコードの量を確認してくださいあなたは生成できますか?これで、クリック、ホバー、要素の存在のアサート、要素へのテキストの入力などができます。
また、可能な限りxpathではなくcssを使用することを必ず検討してください。 xpathは壊れやすく、読みにくくなっています。
私も同じ問題を抱えていました。しかし、私はMinitestでCapybaraを使用しているので、受け入れられた解決策は私にとってはうまくいきませんでした。私と同じ状況の誰かがこの質問を見つけた場合は、追加する必要があると思いました。
以下を使用することもできます。
assert page.has_no_xpath?('//input[@type='#{type}' and @name='#{name}'"]')
スペックファイル内
expect(@app.some_page_name.is_visible?('search_button')) == true
ページファイル内
element :search_button, :xpath, "//div[@class='dummy']"
base_pageファイル内
def is_visible?(value)
begin
eval(value).visible?
return true
rescue => e
p e.message
return false
end
end