ruby-on-rails - rack_test - gem capybara rails
capibara afirma los atributos de un elemento (9)
¿Cómo estás deshabilitando 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 xpath reales pueden ser incorrectos. ¡No uso xpath a menudo!
Estoy usando RSpec2 y Capybara para las pruebas de aceptación.
Me gustaría afirmar que el enlace está desactivado o no en Capybara. ¿Cómo puedo hacer esto?
Fue un poco complicado descubrir el xpath correcto, aquí está el correcto,
usando capibara 0.4.1.1
# <a href="/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 tienes un enlace sin una clase, usa
page.should have_link(''View Clowns'', :href => ''/clowns?ordered_by=clumsyness'')
Algo como esto tristemente no funcionará:
page.should have_link(''This will not work!'', :href => ''/clowns?ordered_by=clumsyness'', :class => "weep")
La opción de clase será ignorada.
Otra solución simple 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 puede que no funcione en algunos casos:
Aquí hay una solución alternativa si tiene problemas con las afirmaciones sobre elementos que se actualizan de forma asíncrona:
Recomiendo usar have_link
y find_link(name)[:disabled]
en dos aserciones separadas. Si bien la realización de la segunda afirmación por sí sola es más simple, esto hace que los mensajes de error sobre enlaces perdidos se vean mejor, lo que hace que los resultados de su prueba sean más fáciles de leer.
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.
Siempre que sea posible, debe intentar utilizar los contenedores proporcionados por Capybara, que funcionarán de manera 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 que al usar este en lugar de selectores de CSS, las pruebas de Javascript funcionarán sin ningún cambio si comienza a usar un controlador con capacidad para Js.
Archivo de prueba ejecutable here .
Simplemente puede usar page.has_css?
método
page.has_css?(''.class_name'')
esto devolverá true
si el elemento existe.
Haga alguna acción basada en la validación.
page.has_css?(''.class_name'') do
#some code
end
Utilizando la sintaxis de Rspec3 lo hice de esta manera:
expect(page).not_to have_selector(:link_or_button, ''Click here'')
bowsersenior , gracias por una pista
Otra solución simple 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
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 los atributos que debe tener el enlace; solo asegúrese de pasar todas las opciones en UN hash.
Espero que esto ayude
PD: para atributos como el método de datos, debe pasar el nombre del atributo como una cadena ya que el guión rompe el símbolo.