Використання:
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 на сторінці, на яку існує посилання:
вміст файлу js.haml:
:plain
var notificationStatusContainer = $('#notification_status');
notificationStatusContainer.val("#{@notification_status_msg}");
notificationStatusContainer.show();
Я тестував свій сценарій надсилання сповіщення та показу повідомлення користувачеві повідомлення про стан сповіщення за допомогою Огірка ( огірок-рейки дорогоцінний камінь із вбудованою підтримкою Capybara )
Я намагався перевірити, що елемент, що має ідентифікатор: message_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 утвердження атрибутів елемента, яке показало, як перевірити атрибут елемента в необробленому вигляді.
Також я знайшов у документації Capybara видиме? методу ( 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.
Таким чином я дійшов висновку, що при тестуванні видимості елемента не покладаються на результати видимості Капібари? метод при використанні селектора CSS та використанні рішення, запропонованого в атрибутах утвердження посилання 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')