Until Capybara 2,
node finders
Show archive.org snapshot
that accept a text
option were able to find nodes based on rendered text, even if it spans over multiple elements in the HTML. Imagine a page that includes this HTML:
<div class='haystack'>
Hi!
<br>
Try to match me.
</div>
Even though the text is separated by a <br>
tag in the HTML, it is matched until Capybara 2 which used to "squish" text prior to the comparison.
# Capyabara 1 or 2
page.find('.haystack', text: "Hi! Try to match me.")
=> #<Capybara::Node::Element tag="div" path=...
If you rely on this behavior in Capybara 3, affected features will fail. The gem no longer normalizes whitespace Show archive.org snapshot when finding elements based on their text.
# Capybara 3
page.find('.haystack', text: "Hi! Try to match me.")
# => Capybara::ElementNotFound: Unable to find visible css ".haystack" with text "Hi! Try to match me."
Re-enabling Cabyara 2 behavior in Capybara 3
After digging in the documentation, you might figure out that you can switch to painfully slow RegExp text matching or add the normalize_ws: true
option to every call of a Capybara finder.
I suggest that you rather configure it globally, which also affects gem dependencies like
Spreewald
Show archive.org snapshot
.
# (Add this to features/support/capybara.rb)
# Capbybara 3 does no longer match DOM Elements with text spanning over
# multiple lines. This configuration re-enables this behavior.
Capybara.default_normalize_ws = true
Please note that the changed behavior can also be observed in
Capybara's RSpec matchers
Show archive.org snapshot
like have_text
.