diff --git a/lib/webrat/session.rb b/lib/webrat/session.rb index 1daeb78..4eeccaa 100644 --- a/lib/webrat/session.rb +++ b/lib/webrat/session.rb @@ -24,7 +24,8 @@ module ActionController # Example: # clicks_link "Sign up" def clicks_link(link_text) - link = links.detect { |el| el.innerHTML =~ /#{link_text}/i } + link = find_shortest_matching_link(link_text) + return flunk("No link with text #{link_text.inspect} was found") if link.nil? onclick = link.attributes["onclick"] @@ -226,6 +227,11 @@ module ActionController request_page(http_method, link.attributes["href"]) end + def find_shortest_matching_link(link_text) + candidates = links.select { |el| el.innerHTML =~ /#{link_text}/i } + candidates.sort_by { |el| el.innerText.strip.size }.first + end + def find_field_by_name_or_label(name_or_label) # :nodoc: input = find_field_by_name(name_or_label) return input if input diff --git a/test/clicks_link_test.rb b/test/clicks_link_test.rb index 5f63ada..4131a00 100644 --- a/test/clicks_link_test.rb +++ b/test/clicks_link_test.rb @@ -159,4 +159,15 @@ class ClicksLinkTest < Test::Unit::TestCase @session.expects(:get_via_redirect).with("/page1", {}) @session.clicks_link "Link text" end + + def test_should_choose_the_shortest_link_text_match + @response.stubs(:body).returns(<<-EOS) + Linkerama + Link + EOS + + @session.expects(:get_via_redirect).with("/page2", {}) + @session.clicks_link "Link" + end + end