Utilizando:
Ruby: ruby 1.9.3dev (2011-09-23 revision 33323) [i686-linux]
Rails: 3.2.9
Capybara: 2.0.3
Tengo una aplicación Rails en la que hay un enlace que, cuando se hace clic, debe enviar una solicitud de publicación AJAX y devolver una respuesta JS.
Código de enlace:
link_to("Send Notification", notification_path(user_id: user_id), remote: true, method: :post)
La respuesta JS (archivo .js.haml) debe alternar el siguiente div oculto en la página donde existe el enlace:
Contenido del archivo js.haml:
:plain
var notificationStatusContainer = $('#notification_status');
notificationStatusContainer.val("#{@notification_status_msg}");
notificationStatusContainer.show();
Estaba probando mi escenario de enviar una notificación y mostrar el mensaje de estado de la notificación al usuario que usa Cucumber ( gema de cucumber-rails con soporte de Capybara incorporado )
Estaba tratando de probar que el elemento que tiene id: notification_status era visible en una respuesta exitosa en mi definición de paso. Para esto, intenté las siguientes declaraciones:
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)
Ninguno de los anteriores funcionó para mí y falló mi paso.De los 5 fragmentos enumerados anteriormente, los últimos 4 fallaron con el siguiente error:
'expected to find css "#notification_status" but there were no matches. Also found "", which matched the selector but not all filters. (Capybara::ExpectationNotMet)'
lo cual fue extraño porque la siguiente declaración pasaba correctamente:
page.has_selector?('#notification_status')
Y de hecho inspeccioné la fuente de la página usando
print page.html
que apareció
<div style='' id='notification_status'></div>
lo que se esperaba.
Finalmente encontré este enlace capibara afirmar atributos de un elemento que mostraba cómo inspeccionar el atributo de un elemento de manera cruda.
También encontré en la documentación de Capybara para visible? método ( http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Element#visible%3F-instance_method ) siguiente información:
Not all drivers support CSS, so the result may be inaccurate.
Por lo tanto, llegué a la conclusión de que al probar la visibilidad de un elemento, ¿no confía en los resultados de la visibilidad de Capybara? método cuando se usa un selector de CSS y se usa la solución sugerida en el enlace capibara afirmar atributos de un elemento
Se me ocurrió lo siguiente:
module CustomMatchers
def should_be_visible(css_selector)
find(css_selector)['style'].should_not include('display:none', 'display: none')
end
end
World(CustomMatchers)
Uso:
should_be_visible('#notification_status')