1

私はこの質問に対する答えを見つけることができませんでした。リンクがページに存在し、正しいテキストとhrefが含まれていることを確認するために、Cucumberで簡単な手順を記述したいと思います。このようなもの:

Then /^I see the page with link "(.*?)" to "(.*?)"$/ do |link,url|
  page.should have_xpath("//a[text()='#{link}',@href='#{url}']")
end

それが機能しないことを除いて。xpath構文が正しくないため、構文の適切な説明を見つけるのに苦労しました。

ありがとう!

4

2 に答える 2

3

あなたが望む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ます。

于 2012-09-18T01:20:10.333 に答える
2

それは次のようになります。

page.should have_link(link, :href => url)

詳しくはカピバラのスペックをご覧ください。

于 2012-08-31T11:18:54.683 に答える