受け入れテストにRSpec2とCapybaraを使用しています。
カピバラではリンクが無効になっているかどうかを主張したいと思います。これどうやってするの?
回答:
リンクをどのように無効にしますか?追加するクラスですか?属性?
# 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をあまり使用しません!
もう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つを次に示します。
find('a#my_element[href]')
、この属性の値を取得することは可能ですか?次のような表現を試してみましたfind('a#my_element[href]').value
が、うまくいかないようです:(
find('a#my_element[href]').text
またはfind('a#my_element[href]').native
。それらのいずれかがあなたが期待する結果を与えるかどうか私に知らせてください。
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")
クラスオプションは無視されます。
have_link
とfind_link(name)[:disabled]
を2つの別々のアサーションで使用することをお勧めします。2番目のアサーションを単独で実行する方が簡単ですが、これにより、リンクの欠落に関するエラーメッセージの見栄えが良くなり、テスト結果が読みやすくなります。
expect(page).to have_link "Example"
expect(find_link("Example")[:disabled]).to be false
"Example"
リンクの名前またはIDに変更できることに注意してください。
page.should have_link('It will work this way!', {:href => '/clowns?ordered_by=clumsyness', :class => "smile"})
have_linkは、オプションのハッシュを予期しますが、何も指定しない場合は空になります。リンクに必要な属性を指定できます。すべてのオプションを1つのハッシュで渡すようにしてください。
お役に立てれば
PS:data-methodのような属性の場合、ハイフンが記号を壊すため、属性名を文字列として渡す必要があります。
class:
無効です
可能な限り、ドライバー間でより一貫して機能する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テストが変更なしで機能することに注意してください。
実行可能なテストファイルはこちら。