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?

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!


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:


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.


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.


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.


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


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

0

Usando la sintaxis de Rspec3 lo hice de esta manera:

expect(page).not_to have_selector(:link_or_button, 'Click here')

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

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.