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

Updated . Posted . Visible to the public.

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.

Profile picture of Michael Leimstädtner
Michael Leimstädtner
Last edit
Michael Leimstädtner
License
Source code in this card is licensed under the MIT License.
Posted by Michael Leimstädtner to makandra dev (2019-05-27 14:28)