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?
ruby-on-rails
rspec
capybara
kriysna
fuente
fuente
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:
fuente
find('a#my_element[href]')
, ¿sería posible recuperar el valor de este atributo? Probar con expresiones comofind('a#my_element[href]').value
pero no parece funcionar :(find('a#my_element[href]').text
ofind('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.
fuente
Recomiendo usar
have_link
yfind_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.fuente
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.
fuente
class:
no es válidoSiempre 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-210Si 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í .
fuente
bowsersenior , gracias por una pista
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
fuente
Usando la sintaxis de Rspec3 lo hice de esta manera:
expect(page).not_to have_selector(:link_or_button, 'Click here')
fuente
Simplemente puedes usar el
page.has_css?
métodopage.has_css?('.class_name')
esto regresará
true
si el elemento existe.Realice alguna acción basada en la validación.
page.has_css?('.class_name') do #some code end
fuente
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)
fuente