Verwenden von:
Ruby: ruby 1.9.3dev (2011-09-23 revision 33323) [i686-linux]
Rails: 3.2.9
Capybara: 2.0.3
Ich habe eine Rails-Anwendung, in der es einen Link gibt, der beim Klicken eine AJAX-Post-Anfrage senden und eine JS-Antwort zurückgeben soll.
Linkcode:
link_to("Send Notification", notification_path(user_id: user_id), remote: true, method: :post)
Die JS-Antwort (.js.haml-Datei) sollte das folgende versteckte Div auf der Seite, auf der der Link vorhanden ist, umschalten:
#notification_status(style='display:none')
Inhalt der js.haml-Datei:
:plain
var notificationStatusContainer = $('#notification_status');
notificationStatusContainer.val("#{@notification_status_msg}");
notificationStatusContainer.show();
Ich habe mein Szenario getestet, in dem eine Benachrichtigung gesendet und dem Benutzer die Benachrichtigungsstatusmeldung mithilfe von Cucumber angezeigt wurde ( Gurkenschienen-Juwel mit integrierter Capybara-Unterstützung ) angezeigt wurde.
Ich habe versucht zu testen, ob das Element mit der ID: notification_status bei erfolgreicher Antwort in meiner Schrittdefinition sichtbar war. Dazu habe ich folgende Anweisungen versucht:
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)
Keiner der oben genannten Punkte hat bei mir funktioniert und meinen Schritt nicht bestanden. Von den oben aufgeführten 5 Snippets sind die letzten 4 mit folgendem Fehler fehlgeschlagen:
'expected to find css "#notification_status" but there were no matches. Also found "", which matched the selector but not all filters. (Capybara::ExpectationNotMet)'
Das war seltsam, weil die folgende Aussage richtig war:
page.has_selector?('#notification_status')
Und tatsächlich habe ich die Seitenquelle mit überprüft
print page.html
was sich zeigte
<div style='' id='notification_status'></div>
was erwartet wurde.
Schließlich fand ich diesen Link Capybara assert Attribute eines Elements , das zeigte sich , wie ein Element des Attributs in roher Weise zu untersuchen.
Auch habe ich in Capybara Dokumentation für sichtbar gefunden? Methode ( http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Element#visible%3F-instance_method ) folgende Informationen:
Not all drivers support CSS, so the result may be inaccurate.
So kam ich zu dem Schluss, dass man beim Testen der Sichtbarkeit eines Elements nicht auf Ergebnisse von Capybaras Sichtbarkeit angewiesen ist? Methode bei Verwendung eines CSS-Selektors und Verwendung der im Link vorgeschlagenen Lösung capybara Assert-Attribute eines Elements
Ich habe mir Folgendes ausgedacht:
module CustomMatchers
def should_be_visible(css_selector)
find(css_selector)['style'].should_not include('display:none', 'display: none')
end
end
World(CustomMatchers)
Verwendung:
should_be_visible('#notification_status')