Heads up: Capybara 3's text matchers no longer squish whitespace by default
Until Capybara 2, node finders 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 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.
# (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 like