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