2012-09-04 13 views
56

Para el HTMLCarpincho: seleccione una opción de valor no texto

<select id="date"> 
    <option value="20120904">Tue 4 Sep 2012</option> 
    <option value="20120905">Wed 5 Sep 2012</option> 
    <option value="20120906">Thu 6 Sep 2012</option> 
</select> 

tengo el siguiente código Carpincho Ruby:

select "20120905", :from => "date" 

Pero esta errores con:

cannot select option, no option with text '20120905' in select box 'date' (Capybara::ElementNotFound) 

Sin embargo , si lo hago

select "Wed 5 Sep 2012", :from => "date" 

Está bien.

¿Es posible seleccionar una opción en Carpincho por Valor no texto?

Gracias

Respuesta

66

Esto funcionará para seleccionar una opción de valor:

find("option[value='20120905']").click 

mantener el ámbito del selector que podría envolverlo en un plazo de bloque como tal:

within '#date' do 
    find("option[value='20120905']").click 
end 
+22

Después de cambiar de Selenium a Poltergeist encontré que este método no funciona. Por lo tanto reemplazado por find ('# select_id'). Find ('option [value = "1"]'). Select_option Lo siento por el mal inglés. – woto

+0

@woto Todas estas opciones no funcionan para mí. Básicamente, la opción se encuentra sin problemas. He verificado el resultado y encuentra la opción correcta, pero no hace clic o lo selecciona. Creo que primero debe abrir la selección antes de seleccionar la opción. –

4

También puede lograrlo haciendo lo siguiente:

find_by_id('date').find("option[value='20120905']").click 
38

Con Poltergeist como piloto no puedo hacer clic en una opción como se sugiere en algunas de las otras opciones anteriores, en lugar usted puede hacer lo siguiente:

page.find_by_id('date').find("option[value='20120905']").select_option

+0

Súper útil. Creé un método de ayuda en spec/support/capybara.rb: def select_option params id = params [: id] valor = params [: valor] page.find_by_id (id) .find ("opción [value = '# {value} '] "). select_option end – justingordon

+3

' hacer clic' en mi causa 'El elemento con el que intentas interactuar no forma parte del DOM, o no está visible actualmente en la página' pero' select_option' funciona para yo estoy bien ¡Gracias! –

+0

Esta es la respuesta para capybara-webkit también. – dojosto

18

me escribió un método de ayuda:

def select_by_value(id, value) 
    option_xpath = "//*[@id='#{id}']/option[@value='#{value}']" 
    option = find(:xpath, option_xpath).text 
    select(option, :from => id) 
end 

guardar en un archivo .rb en spec/support/

Ejemplo del uso:

before do 
    select_by_value 'some_field_id', 'value' 
    click_button 'Submit' 
end 
+0

Nombre que revela la intención, buena implementación. Gracias. – slothbear

+0

Esta (todavía) parece ser la única versión que funciona sin javascript y es algo independiente del controlador ... – Patru

0

clic utilizando find_field funciona bien:

find_field("date").find("option[value='20120905']").click 
+0

Me dio error. No se puede encontrar la opción css "[value = '20120905']" –

1

Ese método de ayuda bastante inteligente. Me gustaría cambiar un poco:

def select_by_value(id, value) 

    option_xpath = "//*[@id='#{id}']/option[@value='#{value}']" 

    find(:xpath, option_xpath).click 

final

o simplemente:

find(:xpath, "//select[@id='date']/option[@value='20120904']").click 
0

También es posible usar capybara-ui que mirar primero para que coincida con el texto, a continuación, para que coincida con el valor.

# define your form widget, in this case in a role 
class UserRole < Capybara::UI::Role 
    form :my_form do 
    select :my_select, 'my_select' 
    end 
end 

# then just submit your form params via #submit 
role = UserRole.new 

role.submit :my_form, my_select: '20120905' 

Ver más acerca de las formas de capybara-ui here.

1

En mi caso tengo algunas opciones con el mismo texto, esa es la razón por la que necesito seleccionar por valor. Combinando algunas respuestas juntas He encontrado la mejor solución para mí:

 
def select_by_value(id, value) 
    option_xpath = "//*[@id='#{id}']/option[@value='#{value}']" 
    find(:xpath, option_xpath).select_option 
end 
Cuestiones relacionadas