Использование:
Ruby: ruby 1.9.3dev (2011-09-23 revision 33323) [i686-linux]
Rails: 3.2.9
Capybara: 2.0.3
У меня есть приложение Rails, в котором есть ссылка, при нажатии на которую следует отправить почтовый запрос AJAX и вернуть ответ JS.
Код ссылки:
link_to("Send Notification", notification_path(user_id: user_id), remote: true, method: :post)
Ответ JS (файл .js.haml) должен переключать следующий скрытый div на странице, на которой существует ссылка:
#notification_status(style='display:none')
Содержимое файла js.haml:
:plain
var notificationStatusContainer = $('#notification_status');
notificationStatusContainer.val("#{@notification_status_msg}");
notificationStatusContainer.show();
Я тестировал свой сценарий отправки уведомления и отображения сообщения о статусе уведомления пользователю с помощью Cucumber ( огуречный рельс с встроенной поддержкой Capybara )
Я пытался проверить, что элемент с идентификатором: messages_status был виден при успешном ответе в моем определении шага. Для этого я попробовал следующие утверждения:
page.find('#notification_status').should be_visible
page.should have_selector('#notification_status', visible: true)
page.should have_css('#notification_status', visible: true)
page.find('#notification_status', visible: true)
page.find(:css, 'div#notification_status', visible: true)
Ни один из перечисленных вышесработал для меня и провалил мой шаг. Из приведенных выше 5 фрагментов последние 4 завершились с ошибкой:
'expected to find css "#notification_status" but there were no matches. Also found "", which matched the selector but not all filters. (Capybara::ExpectationNotMet)'
, что было странно, потому что следующее утверждение проходило правильно:
page.has_selector?('#notification_status')
И на самом деле я проверил источник страницы, используя
print page.html
, который обнаружил
<div style='' id='notification_status'></div>
, что и ожидалось.
Наконец я нашел эту ссылку Capybara Assert атрибуты элемента , который показал, как проверять атрибут элемента в необработанном виде.
Также я нашел в документации по Capybara для видимого?method (http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Element#visible%3F-instance_method) следующая информация:
Not all drivers support CSS, so the result may be inaccurate.
Таким образом, я пришел к выводу, что при тестировании видимости элемента не следует полагаться на результаты метода visible? Capybara при использовании CSSСелектор и используя решение, предложенное в ссылке атрибуты asset capybara элемента
Я придумал следующее:
module CustomMatchers
def should_be_visible(css_selector)
find(css_selector)['style'].should_not include('display:none', 'display: none')
end
end
World(CustomMatchers)
Использование:
should_be_visible('#notification_status')