Heads up: Capybara 3's text matchers no longer squish whitespace by default

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.

Michael Leimstädtner Almost 5 years ago