rails example ruby-on-rails capybara

ruby on rails - example - ¿Cómo escribo una afirmación de Capybara que comprueba la presencia de un botón y su estado habilitado o deshabilitado?



ruby on rails selenium (5)

Desde una situación similar en la que las acciones del usuario en la IU (selección de tipos de documentos) activan los botones para que se habiliten ...

Con una identificación en el control, resulta bastante limpio encontrar el botón (independientemente del estado) y afirmar un estado de "deshabilitado".

@javascript Scenario: Package generation not allowed unless a document type is selected Given I view the "Liberty and 4th Building Renovation" project When I view the Package Creator Then both document package generation buttons should be disabled @javascript Scenario: Package generation allowed when documents types are selected Given I view the "Liberty and 4th Building Renovation" project When I view the Package Creator And I select any document type Then both document package generation buttons should be enabled

Y los pasos de apoyo de pepino con Capibara:

Then(/^both document package generation buttons should be disabled$/) do expect(find_by_id(''generate_pdf'')).to be_disabled expect(find_by_id(''generate_zip'')).to be_disabled end Then(/^both document package generation buttons should be enabled/) do expect(find_by_id(''generate_pdf'')).not_to be_disabled expect(find_by_id(''generate_zip'')).not_to be_disabled end

Tengo una aplicación que habilita / deshabilita botones en respuesta a cosas que suceden en la interfaz de usuario.

Puedo usar capibara fácilmente para detectar si existe un botón

should have_button ''save''

pero no tengo idea de cómo verificar el estado del botón de guardar. Es decir:

¿Cómo escribo una afirmación de Capybara que comprueba la presencia de un botón y su estado habilitado o deshabilitado?

He hackeado juntos un cheque para un botón deshabilitado; para habilitado, supongo que podría verificar que hay un botón coincidente y que no hay un botón deshabilitado coincidente. Pero esto, por decir lo menos, es torpe.

Esto parece una comprobación de UI tan fundamental, que estoy seguro de que me he perdido algo, pero parece que no puedo averiguar qué.

Seguimiento basado en la respuesta de gregates:

Como mencioné en el comentario, el comportamiento de Capybara depende del controlador subyacente. Estamos utilizando webkit y devuelve resultados de cadena "true" / "false". Al parecer, otros controladores devuelven verdadero / falso. La gente de Capybara es consciente del problema (github.com/jnicklas/capybara/issues/705), pero sienten (probablemente correctamente) que no es realmente su problema resolverlo.

En lugar de que mis pruebas dependan del controlador que estoy usando, terminé creando un emparejador personalizado:

RSpec::Matchers.define :be_enabled do match do |actual| driver_result = actual[:disabled] # nil, false, or "false" will all satisfy this matcher (driver_result.nil? || driver_result == false || driver_result == "false").should be_true end end RSpec::Matchers.define :be_disabled do match do |actual| driver_result = actual[:disabled] (driver_result == "disabled" || driver_result == true || driver_result == "true").should be_true end end

A continuación, puede escribir:

user_license_area.find_button(''Save'').should be_disabled


Hay muchas maneras de hacer esto. Creo que la mejor manera es simplemente usar selectores css

expect(page).to have_css("#save:enabled")

Este ejemplo asume que ha configurado el ID de css para guardar.



Parece que el manejo de elementos deshabilitados por parte de Capybara ha cambiado, así que pensé en dar una actualización.

Para probar si una página tiene un botón y está habilitada, use:

expect(page).to have_button(''Save'')

Para probar si una página tiene un botón y está deshabilitada, use:

expect(page).to have_button(''Save'', disabled: true)

Este formato funciona con has_field? , find_field , etc.

Puede leer más sobre esta actualización en http://www.elabs.se/tag/capybara

ACTUALIZAR

El viejo enlace está roto. Este es el problema de GitHub en el que se discutió la característica y esta es la documentación desafortunadamente estéril del método .


find_button(''save'')[:disabled].should eq "disabled"

Tenga en cuenta que una línea comprobará de forma efectiva la existencia y el estado deshabilitado.

Editar: para habilitado, intente

find_button(''save'')[:disabled].should_not be

(Es posible que sea necesario modificar cualquiera de estas pruebas según la manera en que deshabilite / habilite el botón).