2011-03-01 13 views

Respuesta

89

¿Cómo se deshabilita 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!

+0

Gracias @idlefingers, quiero afirmar también usando xpath. ¿Como lo puedo hacer? – kriysna

+0

He actualizado mi respuesta. Si los selectores de xpath son incorrectos, tendrás que buscar en Google o abrir una nueva pregunta. – idlefingers

+0

gracias esta respuesta ayudó :) –

4

que era un poco desordenado para averiguar el XPath correcta, aquí es 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 sólo tiene un enlace sin una clase, utilice

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 se ignorará.

136

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 automáticamente tratará de esperar a que las peticiones asíncronas a fin, pero puede que no funcione en algunos casos:

Aquí es una solución si usted está teniendo problemas con las afirmaciones sobre los elementos que se actualizan de forma asíncrona:

+4

Vrey solución útil. ¡Gracias! –

+0

Tengo una cadena con la ubicación css, por ej. 'find ('a # my_element [href]')', ¿sería posible recuperar el valor de este atributo? Probando con expresiones como 'find ('a # my_element [href]'). Value' pero no parece funcionar :( – mickael

+0

@mickael Pruebe' find ('a # my_element [href]'). Text' or 'find ('a # my_element [href]'). native'.Avíseme si alguno de ellos da los resultados que espera. – bowsersenior

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ía si no se 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 los atributos de datos como método tiene que pasar el nombre del atributo como una cadena desde el guión rompe el símbolo.

+0

Pegarlos con llaves parece funcionar para mí. Gracias. –

+6

[Nunca funcionó] (https://github.com/jnicklas/capybara/issues/1016#issuecomment-15020730) y no funciona con Capybara. No sé por qué 9 personas votaron a favor de esto. –

+0

Esto ya no funciona en Capybara 2. Las personas que usan Capybara <2 pueden usar el – Tian

0

bowsersenior, gracias por una pista

Otra solución simple es acceder al atributo HTML que están buscando con []

Aquí se muestra 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 
1

Siempre que sea posible, debe intentar usar los envoltorios proporcionados por Capybara que funcionarán de manera más uniforme conductores.

Para el caso particular de disabled, un envoltorio se introdujo en 2.1: https://github.com/jnicklas/capybara/blob/fc56557a5463b9d944207f2efa401faa5b49d9ef/History.md#version-210

Si lo usa, obtendrá resultados razonables en tanto RackTest y 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 

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

3

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 el nombre o la identificación del enlace.

0

Utilizando la sintaxis de Rspec3 lo hice de esta manera:

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

Simplemente puede utilizar page.has_css? método

page.has_css?('.class_name') 

esto devolverá true si existe el elemento.

Acción realizada en base a la validación.

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