2011-03-22 13 views
38

¿Cómo uso Capybara para verificar que un cuadro de selección tenga ciertos valores enumerados como opciones? Tiene que ser compatible con selenio ...El cuadro de selección de verificación tiene ciertas opciones con Capybara

Este es el código HTML que tengo:

<select id="cars"> 
    <option></option> 
    <option value="volvo">Volvo</option> 
    <option value="saab">Saab</option> 
    <option value="mercedes">Mercedes</option> 
    <option value="audi">Audi</option> 
</select> 

Esto es lo que quiero hacer:

Then the "cars" field should contain the option "audi" 
+1

Sería útil si pudiera publicar su HTML/ERB para la sección en cuestión. – polarblau

Respuesta

57

intente utilizar el capibara rspec matcher have_select(locator, options = {}) lugar:

#Find a select box by (label) name or id and assert the given text is selected 
Then /^"([^"]*)" should be selected for "([^"]*)"$/ do |selected_text, dropdown| 
    expect(page).to have_select(dropdown, :selected => selected_text) 
end 

#Find a select box by (label) name or id and assert the expected option is present 
Then /^"([^"]*)" should contain "([^"]*)"$/ do |dropdown, text| 
    expect(page).to have_select(dropdown, :options => [text]) 
end 
+35

Para los usuarios de RSpec, utilicé 'page.should have_select ('Something',: options => ['plain text'])' –

+1

@hubble, su comentario definitivamente debería tener una respuesta propia :) –

+9

Puede también use 'with_options' para verificar que existan opciones específicas sin especificar todo en orden – aceofspades

3
Then I should see "audi" within "#cars" 

debe hacer el truco

+0

Gracias pero no está funcionando. En "automóviles" de pepino sería un "campo" y "dentro" implica un alcance. Entonces, un paso estándar que se acerca es 'Entonces el campo de "autos" debe contener "Audi"'. Pero si no se selecciona nada, devuelve una cadena vacía: expected:/Audi /, got: "" –

+0

¿cómo pueden los automóviles ser un campo cuando es claramente una etiqueta de selección? está comprobando si existe la opción de Audi en el menú desplegable de su vehículo, ¿verdad? o está revisando si fue la opción seleccionada? – corroded

22

Por lo que vale, lo llamaría un menú desplegable, no un campo, así que escribiría:

Then the "cars" drop-down should contain the option "audi" 

Para responder a su pregunta, aquí está el código RSpec para implementar esta (no probado):

Then /^the "([^"]*)" drop-down should contain the option "([^"]*)"$/ do |id, value| 
    page.should have_xpath "//select[@id = '#{id}']/option[@value = '#{value}']" 
end 

Si desea probar para el texto opción en lugar del atributo de valor (lo que podría hacer para more readable escenarios), se podría escribir:

page.should have_xpath "//select[@id = '#{id}']/option[text() = '#{value}']" 
+0

Hombre, tengo que empezar a aprender xpath ... gracias –

+1

Las opciones deben ser opcionales ... ah bueno, lo estoy haciendo con esta página. Debería tener_css ('seleccionar opción: contiene (' Audi ')',: visible => true) ¿Por qué? El código es más legible, además verifica que el elemento esté visible ... –

+0

@Tom: La pseudo-clase 'contains' fue [sacada de la especificación CSS] (http://www.w3.org/TR/css3- selectores/# selectores de contenido), así que no estoy seguro de si esto funcionará en todas partes, pero aparte de eso, CSS es igual de bueno (y estoy de acuerdo en que es más legible). Puede usar: visible en [cualquiera de los métodos] (http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Matchers#has_xpath%3F-instance_method), por cierto. Reaprendiendo XPath, he ido muy lejos con solo [los ejemplos en la especificación] (http://www.w3.org/TR/xpath/#path-abbrev) (y [estos también] (http: //www.w3.org/TR/xpath/#location-paths)). –

11

Bueno, desde que tenía alrededor y vi la cuestión (y estado probando hoy en día) decidí publicar mi manera:

within("select#cars") do 
    %w(volvo saab mercedes audi).each do |option| 
    expect(find("option[value=#{option}]").text).to eq(option.capitalize) 
    end 
end 
11

Como solución alternativa, y como yo no estoy familiarizado con XPaths, Hice esto para resolver un problema similar:

page.all('select#cars option').map(&:value).should == %w(volvo saab mercedes audi) 

Es bastante simple, pero me tomó un tiempo darme cuenta.

+2

muy bueno para la depuración en realidad :) –

Cuestiones relacionadas