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."
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
.