web-dev-qa-db-ja.com

要素がカピバラに存在しないことを確認してください

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

私はカピバラが初めてなので、明らかなことを見逃しているかもしれません。

33
michaeltwofish

Capybaras has_no_selector? rspecsマジックマッチャーと組み合わせたメソッド。その後、次のように使用できます。

 page.should have_no_selector(:xpath, "//input[@type='#{type}' and @name='#{name}']")

実行できるアサーションの詳細は、カピバラのドキュメントページ here の「クエリ」というタイトルのセクションにあります

52
Derek Ekins

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?

などなど 。 。 。

25
5_nd_5

これが私が使っているものです:

expect(page).to have_no_css('.test')
10
nroose

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

これはとにかくあなたが求めているものに近いと思います。だから私はこれを答えとして提示しました。

3
Zack Xu

これを行う最善の方法は、要素を見つけて、それが存在しないことをアサートすることです。これは再利用可能なコードを作成するだけでなく、それが見つからない場合でもテスト全体が失敗することはありません。

これが私がすることです...

オブジェクトを定義する

def username
    page.find('.username')
end

次に、スペックファイル内のオブジェクトを操作します

username.should be_true

要素がページ上にあるかどうかは、ほとんど気にする必要はありません(ほとんどの場合)。テストを作成しているときに気にするのは、その要素を操作できるかどうかです...そのため、最初にオブジェクトを定義し、次に 'username'を使用して操作します...再利用可能なコードの量を確認してくださいあなたは生成できますか?これで、クリック、ホバー、要素の存在のアサート、要素へのテキストの入力などができます。

また、可能な限りxpathではなくcssを使用することを必ず検討してください。 xpathは壊れやすく、読みにくくなっています。

1
Whitney Imura

私も同じ問題を抱えていました。しかし、私はMinitestでCapybaraを使用しているので、受け入れられた解決策は私にとってはうまくいきませんでした。私と同じ状況の誰かがこの質問を見つけた場合は、追加する必要があると思いました。

以下を使用することもできます。

assert page.has_no_xpath?('//input[@type='#{type}' and @name='#{name}'"]')

0
Kristiina

スペックファイル内

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
0
Prashanth Sams