114

I have following two elements in HTML

<a href="/berlin" >Berlin</a>
<a href="/berlin" >Berlin Germany </a>

I am trying to find the element by using following Capybara method

find("a", :text => "berlin")

Above will return two elements because both contains text berlin.

Is there a way to match exact text in Capybara ?

pje
  • 20,728
  • 10
  • 53
  • 68
amjad
  • 2,726
  • 7
  • 24
  • 40

6 Answers6

145

Use a regexp instead of a string for the value of the :text key:

find("a", :text => /\ABerlin\z/)

Check out the 'Options Hash' section of the Method: Capybara::Node::Finders#all documentation.

PS: text matches are case sensitive. Your example code actually raises an error:

find("a", :text => "berlin")
# => Capybara::ElementNotFound:
#    Unable to find css "a" with text "berlin"
pje
  • 20,728
  • 10
  • 53
  • 68
61

Depending on which version of the gem you are using

find('a', text: 'Berlin', exact: true)

may be deprecated. In which case you would have to use

find('a', text: 'Berlin', match: :prefer_exact)
Alex V
  • 17,788
  • 5
  • 34
  • 35
Gabriel Pumple
  • 753
  • 5
  • 15
16

You can do so too:

find('a', text: 'Berlin', exact_text: true)

That will find for CSS.

And using only exact: true instead of exact_text will show you a msg that exact option is only valid for XPATH.

CamiloVA
  • 488
  • 4
  • 11
7

Just use Capybara's exact option:

Capybara.exact = true
ndnenkov
  • 34,386
  • 9
  • 72
  • 100
John W
  • 324
  • 2
  • 3
5

My preference is to use the have_selector with text and exact_text: true:

expect(body).to have_selector 'a', text: 'Berlin', exact_text: true
Paweł Gościcki
  • 8,327
  • 5
  • 65
  • 76
0

For using click_link in capybara you need to add one more property in the method using it.

click_link(link_name, :text => link_name)

Here the link_name is the text value of a link. Using :text keyword we are specifying that we want to click on a link having the text value which is exact matching to our requirement.

Sunil Kumar
  • 390
  • 3
  • 14