あなたが望むXPathは
page.should have_xpath("//a[text()='#{link}' and @href='#{url}']")
Cucumber には詳しくありませんが、Capybara に依存している場合はhas_link?
、@shioyama が提案する代替案の方が読みやすいです。
page.should have_link(link, :href => url)
しかし、それは一見シンプルでもあります。については、次のことhas_link?
に注意してください。
- 部分文字列を検索します (XPath の例では完全一致を検索します)。
- テキスト値だけでなく、id、title、および img alt フィールドでも「リンク」を検索します。
:text
または など、他の属性をオプションとして指定する:class
と、それらは黙って無視されます。テストを狭めていると思うかもしれませんが、そうではありません。
次の HTML を検討してください。
<a href="/contacts/3" data-confirm="Are you sure?" data-method="delete"
title="Delete Contact 3">Delete</a>
has_link?
の部分文字列を検索する と、次の条件の両方がそのリンクに一致するtitle
ことがわかり、かなり驚きました。
has_link?("Contact 3", href: "/contacts/3")
has_link?("Delete", href: "/contacts/3")
私は現在has_exact_link
、XPath を明示的にフォーマットすることであいまいさを排除するカスタム マッチャーを試しています。:href
部分文字列ではなく、テキスト値のみの完全一致を検索し、エラーを発生させる以外のオプションを検索します。
仕様/サポート/matchers.rb
# Check for an <a> tag with the exact text and optional :href and :count.
# Same param syntax as has_link, but it only matches the link's TEXT, not id,
# label, etc., and it doesn't match substrings.
def has_exact_link?(locator, options={})
# Subtract :href, :count from array of options.keys
# Raise error if any options remain
raise ArgumentError.new \
"options, if supplied, must be a hash" if !options.is_a?(Hash)
raise ArgumentError.new \
"has_exact_link only supports 'href' and 'count' as options" unless
(options.keys - [:href] - [:count]).empty?
href = options[:href]
xpath = href ? "//a[normalize-space(text())='#{locator}' and @href='#{href}']" :
"//a[normalize-space(text())='#{locator}']/@href"
# pass original options has so test results will show options if present
# has_xpath apparently ignores :href in options but will use :count.
has_xpath?(xpath, options)
end
2012 年 9 月 19 日更新:上記 に「normalize-space」を追加has_exact_link
して、HTML のように前後の空白を無視するようにしました。<a>
これは、たとえば、リンクのテキストがタグとは異なる行にある場合に必要です。
<a href="/contacts/3">
Contact 3
</a>
まだ部分文字列と一致しません。has_exact_link("Contact 3")
上記と一致させるには、だけでなく を指定する必要がありますhas_exact_link("Contact")
。
更新 2012 年 9 月 20 日上記の別のhas_exact_link
更新。options
これで、パラメーターの型チェックが行われ、:count
オプションと同様に処理され:href
ます。