Я только что обновил свое приложение 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 теперь заботится о разрывах строк в текстах ссылок...? Я могу исправить это, используя:
expect(page).to have_css '.active a', text: "Reports (1)\n- current menu item"
Но мне это кажется странным. Может ли кто-нибудь объяснить мне, что здесь нового и как справиться с этой ситуацией? Спасибо.
Спасибо, это очень интересно.
Начиная с версии 3, Capybara пытается сопоставить текст в том виде, в котором он отображается — это означает, что если отображаемый текст содержит в себе <br> или частично заключен в блочный элемент и т. д., то в тексте будет перевод строки.
Как справиться с ситуацией, зависит от того, что вы пытаетесь сделать. По умолчанию опция text
соответствует подстрокам, поэтому, если вам не нужен полный текст, вы можете сделать
expect(page).to have_css('.active a', text: 'current menu item')
вы также можете указать регулярное выражение для опции text
expect(page).to have_css('.active a', text: /Reports (\d+)/)
или, как вы показали, вы можете добавить \n, чтобы проверить отображаемый текст
Это очень интересно. Мне нужно будет посмотреть, использовал ли я display: block
для некоторых содержащихся текстовых элементов.
Не уверен, какую версию вы использовали до обновления, но в 3.0.0 этот коммит был введен и, похоже, это то, о чем вы говорите. «Видимые пробелы в тексте больше не нормализуются полностью, чтобы больше соответствовать спецификации WebDriver для видимого текста» см. здесь