カピバラは要素の属性をアサートします


87

受け入れテストにRSpec2とCapybaraを使用しています。

カピバラではリンクが無効になっているかどうかを主張したいと思います。これどうやってするの?

回答:


91

リンクをどのように無効にしますか?追加するクラスですか?属性?

# Check for a link that has a "disabled" class:
page.should have_css("a.my_link.disabled")
page.should have_xpath("//a[@class='disabled']")

# Check for a link that has a "disabled" attribute:
page.should have_css("a.my_link[disabled]")
page.should have_xpath("//a[@class='disabled' and @disabled='disabled']")

# Check that the element is visible
find("a.my_link").should be_visible
find(:xpath, "//a[@class='disabled']").should be_visible

実際のxpathセレクターは正しくない可能性があります。私はxpathをあまり使用しません!


@idlefingersに感謝します。xpathを使用してアサートしたいと思います。どうすればよいですか?
kriysna 2011年

回答を更新しました。xpathセレクターが間違っている場合は、グーグルを実行するか、新しい質問を開く必要があります。
アイドルフィンガー2011年

capybaraはビューで機能するように作成されていないため、これはビューのテストでは機能しないことに注意してください。(Webratはです。)
Peter Ehrlich

145

もう1つの簡単な解決策は、探しているHTML属性にアクセスすることです[]

find('#my_element')['class']
# => "highlighted clearfix some_other_css_class"

find('a#my_element')['href']
# => "http://example.com

# or in general, find any attribute, even if it does not exist
find('a#my_element')['no_such_attribute']
# => ""

Capybaraは自動的に非同期リクエストの終了を待機しようとしますが、場合によっては機能しない可能性があることに注意してください。

非同期で更新される要素のアサーションで問題が発生した場合の回避策の1つを次に示します。


4
Vreyの便利なソリューション。ありがとう!
Alexander Kuznetsov 2012年

cssの場所を含む文字列があります。find('a#my_element[href]')、この属性の値を取得することは可能ですか?次のような表現を試してみましたfind('a#my_element[href]').valueが、うまくいかないようです:(
mickael 2012

@mickaelTryfind('a#my_element[href]').textまたはfind('a#my_element[href]').native。それらのいずれかがあなたが期待する結果を与えるかどうか私に知らせてください。
bowsersenior 2012

1
これらのコメントは本当に古いことを認識していますが、次のように使用しました:page.find( '#my_element')['href = "<href_value>"']そしてそれは扱いました
Dono

非同期の変更についてアサーションを作成する場合、これはクエリがtrueになるのを待ちません。
sj26 2015

4


capybara 0.4.1.1を使用して、正しいxpathを見つけるのは少し面倒でした。これが正しいxpathです。

# <a href="https://stackoverflow.com/clowns?ordered_by=clumsyness" class="weep">View Clowns</a>  

page.should have_xpath("//a[@class='weep'][@href='/clowns?ordered_by=clumsyness']", :text => "View Clowns")

クラスのないリンクしかない場合は、

page.should have_link('View Clowns', :href => '/clowns?ordered_by=clumsyness')

このようなものは悲しいことに機能しません:

page.should have_link('This will not work!', :href => '/clowns?ordered_by=clumsyness', :class => "weep")

クラスオプションは無視されます。


4

have_linkfind_link(name)[:disabled]を2つの別々のアサーションで使用することをお勧めします。2番目のアサーションを単独で実行する方が簡単ですが、これにより、リンクの欠落に関するエラーメッセージの見栄えが良くなり、テスト結果が読みやすくなります。

expect(page).to have_link "Example"
expect(find_link("Example")[:disabled]).to be false

"Example"リンクの名前またはIDに変更できることに注意してください。


1
page.should have_link('It will work this way!', {:href => '/clowns?ordered_by=clumsyness', :class => "smile"})

have_linkは、オプションのハッシュを予期しますが、何も指定しない場合は空になります。リンクに必要な属性を指定できます。すべてのオプションを1つのハッシュで渡すようにしてください。

お役に立てれば

PS:data-methodのような属性の場合、ハイフンが記号を壊すため、属性名を文字列として渡す必要があります。


6
それは決して機能せず、カピバラでは機能しません。なぜ9人がこれに賛成したのかわかりません。
アンドレイボタロフ2013年

これはCapybara2では機能しなくなりました。Capybara<2を使用している人は、上記を使用できます
Tian

@Tianそれはカピバラ<2では機能しませんでした。この答えに反対票を投じることをお勧めします。
アンドレイボタロフ2013

class:無効です
Amir Raminfar 2014年

1

可能な限り、ドライバー間でより一貫して機能するCapybaraが提供するラッパーを使用するようにしてください。

の特定のケースでdisabledは、ラッパーが2.1で導入されました:https//github.com/jnicklas/capybara/blob/fc56557a5463b9d944207f2efa401faa5b49d9ef/History.md#version-210

これを使用すると、RackTestとPoltergeistの両方で賢明な結果が得られます。

HTML:

<input type="text" id="disabled-false"            ></div>
<input type="text" id="disabled-true"     disabled></div>
<input type="text" id="disabled-js-true"          ></div>
<input type="text" id="disabled-js-false" disabled></div>
<script>
  document.getElementById('disabled-js-true').disabled = true
  document.getElementById('disabled-js-false').disabled = false
</script>

テスト:

!all(:field, 'disabled-false',    disabled: false).empty? or raise
 all(:field, 'disabled-false',    disabled: true ).empty? or raise
 all(:field, 'disabled-true',     disabled: false).empty? or raise
!all(:field, 'disabled-true',     disabled: true ).empty? or raise
 all(:field, 'disabled-js-true',  disabled: true ).empty? or raise
 all(:field, 'disabled-js-false', disabled: false).empty? or raise

Capybara.current_driver = :poltergeist
!all(:field, 'disabled-false',    disabled: false).empty? or raise
 all(:field, 'disabled-false',    disabled: true ).empty? or raise
 all(:field, 'disabled-true',     disabled: false).empty? or raise
!all(:field, 'disabled-true',     disabled: true ).empty? or raise
!all(:field, 'disabled-js-true',  disabled: true ).empty? or raise
!all(:field, 'disabled-js-false', disabled: false).empty? or raise

CSSセレクターの代わりにこれを使用することで、Js対応ドライバーの使用を開始した場合、Javascriptテストが変更なしで機能することに注意してください。

実行可能なテストファイルはこちら


0

bowsersenior、ヒントをありがとう

もう1つの簡単な解決策は、[]を使用して探しているHTML属性にアクセスすることです。

次に例を示します。

let(:action_items) { page.find('div.action_items') }

it "action items displayed as buttons" do
  action_items.all(:css, 'a').each do |ai|
    expect(ai[:class]).to match(/btn/)
  end
end

0

Rspec3の構文を使用して、次のようにしました。

expect(page).not_to have_selector(:link_or_button, 'Click here')

0

単にあなたはpage.has_css?方法を使うことができます

page.has_css?('.class_name') 

true要素が存在する場合、これが返されます。

検証に基づいて何らかのアクションを実行します。

page.has_css?('.class_name') do
  #some code
end

0

ドキュメントによると [属性]アクセサー構文を使用できます。

find('#selector')['class'] => "form-control text optional disabled"

障害者の場合は、次のこともできます。

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