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 来验证显示的文本
我刚刚将我的 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 来验证显示的文本