У меня есть плавающее меню, которое появляется, когда пользователь нажимает кнопку меню (кнопка скрыта за плавающим меню на изображении ниже).
Функциональность отлично работает в живом браузере (пробовал на Firefox, Safari и Chrome).
Однако при тестировании с Capybara-Webkit он не работает - меню никогда не становится видимым при нажатии
Вот базовая реализация:
HTML
Это меню <ul>
, которое находится внутри <div>
<div class="location-card">
...
<div class="location-card__menu-btn">
<%= inline_svg("icons/menu-btn-icon.svg", height: "20px", width: "20px") %>
<ul class="location-card__menu">
<li>Delete</li>
<li>Open</li>
<li>Share</li>
...
</ul>
</div>
</div>
JS
Простой javascript / jquery устанавливает класс переключения (location-card--menu-open
) на верхнем уровне<div>
всякий раз, когда нажимается кнопка.
$(".location-card").on("click", ".location-card__menu-btn", function(e) {
// Find the card element top-level div
var card = $(e.currentTarget).parents(".location-card");
// Set the toggle class
$(card).addClass("location-card--menu-open");
});
CSS
Наконец, CSS для меню по умолчанию равен display: none
, но изменяется на display: flex
, когда класс переключенияприсутствует на родителя.
.location-card__menu {
display: none;
...
}
.location-card--menu-open .location-card__menu {
display: flex;
...
}
RSpec / Capybara
При тестировании я делаю следующее:
// Click the menu button
find(".location-card__menu-btn").click
// Verify that the menu opened and is visible
expect(page).to have_selector(".location-card__menu", visible: true)
, в который Capybara выдает ошибку:
expected to find visible css ".location-card__menu" within #<Capybara::Node::Element ... > but there were no matches. Also found "", which matched the selector but not all filters.
Как говорится в сообщении об ошибке, элемент найден, но не виден, хотя класс переключения добавлен правильно.Правило CSS, которое добавляет display: flex
, не применяется, даже если класс-родитель существует.
Я могу убедиться, что это проблема, удалив display: none
, чтобы меню отображалось по умолчанию, а затем все отлично работает и тест проходит.
Любая идея, почему Capybara или соответствующий браузерможет быть не удается повторно применить логику CSS после изменения DOM?
Я использую:
- rspec-rails 3.4.0
- capybara 2.18.0
- capybara-webkit 1.15.0
Спасибо!