Estoy usando RSpec2 y Capybara para las pruebas de aceptación.
Me gustaría afirmar que el enlace está deshabilitado o no en Capybara. ¿Cómo puedo hacer esto?
Respuestas:
¿Cómo deshabilitas el enlace? ¿Es una clase que estás agregando? ¿Un atributo?
# Check for a link that has a "disabled" class:
page.should have_css("a.my_link.disabled")
page.should have_xpath("//a[@class='disabled']")
# Check for a link that has a "disabled" attribute:
page.should have_css("a.my_link[disabled]")
page.should have_xpath("//a[@class='disabled' and @disabled='disabled']")
# Check that the element is visible
find("a.my_link").should be_visible
find(:xpath, "//a[@class='disabled']").should be_visible
Los selectores de xpath reales pueden ser incorrectos. ¡No uso xpath a menudo!
Otra solución sencilla es acceder al atributo HTML que está buscando con []
:
find('#my_element')['class']
# => "highlighted clearfix some_other_css_class"
find('a#my_element')['href']
# => "http://example.com
# or in general, find any attribute, even if it does not exist
find('a#my_element')['no_such_attribute']
# => ""
Tenga en cuenta que Capybara
intentará esperar automáticamente a que finalicen las solicitudes asincrónicas, pero es posible que no funcione en algunos casos:
Aquí hay una solución si tiene problemas con las aserciones en elementos que se actualizan de forma asincrónica:
find('a#my_element[href]')
, ¿sería posible recuperar el valor de este atributo? Probar con expresiones como find('a#my_element[href]').value
pero no parece funcionar :(
find('a#my_element[href]').text
o find('a#my_element[href]').native
. Avíseme si alguno de ellos da los resultados que espera.
Fue un poco complicado encontrar el xpath correcto, aquí está el correcto,
usando capibara 0.4.1.1
# <a href="https://stackoverflow.com/clowns?ordered_by=clumsyness" class="weep">View Clowns</a>
page.should have_xpath("//a[@class='weep'][@href='/clowns?ordered_by=clumsyness']", :text => "View Clowns")
Si solo tiene un enlace sin una clase, use
page.should have_link('View Clowns', :href => '/clowns?ordered_by=clumsyness')
Algo como esto lamentablemente no funcionará:
page.should have_link('This will not work!', :href => '/clowns?ordered_by=clumsyness', :class => "weep")
La opción de clase será ignorada.
Recomiendo usar have_link
y find_link(name)[:disabled]
en dos afirmaciones separadas. Si bien realizar la segunda afirmación por sí sola es más simple, esto hace que los mensajes de error sobre enlaces faltantes se vean mejor, lo que facilita la lectura de los resultados de la prueba.
expect(page).to have_link "Example"
expect(find_link("Example")[:disabled]).to be false
Tenga en cuenta que "Example"
se puede cambiar por el nombre o la identificación del enlace.
page.should have_link('It will work this way!', {:href => '/clowns?ordered_by=clumsyness', :class => "smile"})
have_link espera un hash de opciones que está vacío si no proporciona ninguna. Puede especificar cualquier atributo que deba tener el enlace, solo asegúrese de pasar todas las opciones en UN hash.
Espero que esto ayude
PD: Para atributos como método de datos, debe pasar el nombre del atributo como una cadena, ya que el guión rompe el símbolo.
class:
no es válido
Siempre que sea posible, debería intentar utilizar los contenedores proporcionados por Capybara, que funcionarán de forma más uniforme en todos los controladores.
Para el caso particular de disabled
, se introdujo un contenedor en 2.1: https://github.com/jnicklas/capybara/blob/fc56557a5463b9d944207f2efa401faa5b49d9ef/History.md#version-210
Si lo usa, obtendrá resultados razonables tanto en RackTest como en Poltergeist:
HTML:
<input type="text" id="disabled-false" ></div>
<input type="text" id="disabled-true" disabled></div>
<input type="text" id="disabled-js-true" ></div>
<input type="text" id="disabled-js-false" disabled></div>
<script>
document.getElementById('disabled-js-true').disabled = true
document.getElementById('disabled-js-false').disabled = false
</script>
Pruebas:
!all(:field, 'disabled-false', disabled: false).empty? or raise
all(:field, 'disabled-false', disabled: true ).empty? or raise
all(:field, 'disabled-true', disabled: false).empty? or raise
!all(:field, 'disabled-true', disabled: true ).empty? or raise
all(:field, 'disabled-js-true', disabled: true ).empty? or raise
all(:field, 'disabled-js-false', disabled: false).empty? or raise
Capybara.current_driver = :poltergeist
!all(:field, 'disabled-false', disabled: false).empty? or raise
all(:field, 'disabled-false', disabled: true ).empty? or raise
all(:field, 'disabled-true', disabled: false).empty? or raise
!all(:field, 'disabled-true', disabled: true ).empty? or raise
!all(:field, 'disabled-js-true', disabled: true ).empty? or raise
!all(:field, 'disabled-js-false', disabled: false).empty? or raise
Tenga en cuenta cómo al usar esto en lugar de los selectores de CSS, las pruebas de Javascript funcionarán sin ningún cambio si comienza a usar un controlador compatible con Js.
Archivo de prueba ejecutable aquí .
bowsersenior , gracias por una pista
Otra solución sencilla es acceder al atributo HTML que está buscando con []
Aquí hay un ejemplo:
let(:action_items) { page.find('div.action_items') }
it "action items displayed as buttons" do
action_items.all(:css, 'a').each do |ai|
expect(ai[:class]).to match(/btn/)
end
end
Usando la sintaxis de Rspec3 lo hice de esta manera:
expect(page).not_to have_selector(:link_or_button, 'Click here')
De acuerdo con los documentos , puede usar la sintaxis de acceso de [atributo]:
find('#selector')['class'] => "form-control text optional disabled"
Para discapacitados, también puede hacer esto:
expect(find('#selector').disabled?).to be(true)