RSpec 和 Capybara:如何让 have_css 带有文本:忽略文本中的换行符

RSpec and Capybara: how to let have_css with text: ignore line breaks in text

我刚刚将我的 Rails 应用程序从 Rails 5 升级到 6。

现在以下断言不再有效:

expect(page).to have_css '.active a', text: "Reports (1)- current menu item"

错误:

expected to find visible css ".active a" with text "Reports (1) - current menu item" within #<Capybara::Node::Element tag="div" path="/HTML/BODY[1]/MAIN[1]/DIV[1]/DIV[1]/DIV[1]/DIV[2]"> but there were no matches. Also found "Reports (1)\n- current menu item", which matched the selector but not all filters.

那么看起来 Capybara 现在关心 link 文本中的换行符......?我可以使用以下方法修复它:

expect(page).to have_css '.active a', text: "Reports (1)\n- current menu item"

但这对我来说很奇怪。任何人都可以向我解释这里有什么新内容以及如何处理这种情况吗?谢谢。

从第 3 版开始,Capybara 会尝试匹配显示的文本 - 这意味着如果显示的文本中有
,或者部分包裹在块元素内等,那么文本将有在其中换行。

如何处理这种情况取决于你想做什么。默认情况下 text 选项匹配子字符串,所以如果你真的不关心全文你可以做

expect(page).to have_css('.active a', text: 'current menu item')

您还可以为 text 选项指定正则表达式

expect(page).to have_css('.active a', text: /Reports (\d+)/)

或者如您所示,您可以添加 \n 来验证显示的文本