capibara afirmar atributos de un elemento

87

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?

kriysna
fuente

Respuestas:

91

¿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!

dedos inactivos
fuente
Gracias @idlefingers, quiero afirmar el uso de xpath también. ¿Como lo puedo hacer?
kriysna
Actualicé mi respuesta. Si los selectores de xpath están equivocados, tendrá que buscar en Google o abrir una nueva pregunta.
idlefingers
Tenga en cuenta que esto no funcionará para las pruebas de vista, ya que el capibara no está diseñado para funcionar con vistas. (Webrat es.)
Peter Ehrlich
145

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 Capybaraintentará 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:

arquero
fuente
4
Solución útil de Vrey. ¡Gracias!
Alexander Kuznetsov
Tengo una cadena con la ubicación css, por ejemplo. find('a#my_element[href]'), ¿sería posible recuperar el valor de este atributo? Probar con expresiones como find('a#my_element[href]').valuepero no parece funcionar :(
mickael
@mickael Prueba find('a#my_element[href]').texto find('a#my_element[href]').native. Avíseme si alguno de ellos da los resultados que espera.
bowsersenior
1
Me doy cuenta de que estos comentarios son muy antiguos, pero los usé de esta manera: page.find ('# my_element') ['href = "<href_value>"'] y funcionó de maravilla
Dono
Esto no esperará a que la consulta se convierta en verdadera si desea hacer una afirmación sobre un cambio asincrónico.
sj26
4

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.

Clint
fuente
4

Recomiendo usar have_linky 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.

Nick McCurdy
fuente
1
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.

kaikuchn
fuente
6
Nunca funcionó y no funciona con Capybara. No sé por qué 9 personas votaron a favor de esto.
Andrei Botalov
Esto ya no funciona en Capybara 2. Las personas que usan Capybara <2 pueden usar lo anterior
Tian
@Tian no funcionó en Capybara <2. Le sugiero que rechace esta respuesta.
Andrei Botalov
class:no es válido
Amir Raminfar
1

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í .

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
0

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
18 de agosto
fuente
0

Usando la sintaxis de Rspec3 lo hice de esta manera:

expect(page).not_to have_selector(:link_or_button, 'Click here')
Camilo Triste
fuente
0

Simplemente puedes usar el page.has_css?método

page.has_css?('.class_name') 

esto regresará truesi el elemento existe.

Realice alguna acción basada en la validación.

page.has_css?('.class_name') do
  #some code
end
Aravin
fuente
0

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)
pixelearth
fuente