rails rack_test feature example ruby-on-rails rspec capybara

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.