what tutorial rails ruby selenium-webdriver capybara

ruby - tutorial - Cómo seleccionar la opción en menú desplegable usando Capybara



selenium rails (7)

Desafortunadamente, la respuesta más popular no funcionó completamente para mí. Tuve que agregar .select_option al final de la declaración

select("option_name_here", from: "organizationSelect").select_option

sin la select_option , no se estaba realizando ninguna selección

Estoy tratando de seleccionar un elemento de un menú desplegable usando Capybara (2.1.0).

Quiero seleccionar por número (es decir, seleccionar la segunda, tercera opción, etc.).

Busqué en Google como loco intentando todo tipo de cosas pero sin suerte.

Pude seleccionarlo usando el valor:

find("option[value=''4c430d62-f1ba-474f-8e8a-4452c55ea0a8'']").click

Pero no quiero usar ese método, porque el valor es algo que cambiará y eso hará que mi prueba sea frágil.

El HTML para el menú desplegable es:

<td class="value"> <select name="organizationSelect" id="organizationSelect" class="required"> <option value="NULL">Choose...</option> <option value="4c430d62-f1ba-474f-8e8a-4452c55ea0a8">&nbsp;Institution1</option> <option value="e1a4efa7-352d-410a-957e-35c8a3b92944">&nbsp;Institution / test</option> </select> </td>

También intenté esto:

option = find(:xpath, "//*[@id=''organizationSelect'']/option[2]").text select(option, :from => organizationSelect)

Pero resulta en este error:

Ambiguous match, found 2 elements matching option "Institution" (Capybara::Ambiguous)

Entonces, ¿cómo puedo seleccionar la primera, segunda, tercera, etc. opción del menú desplegable (usando Capybara)?


No es una respuesta directa, pero puede (si su servidor lo permite):

1) Crea un modelo para tu organización; extra: será más fácil llenar tu HTML.

2) Crear una fábrica (FactoryGirl) para su modelo;

3) Crear una lista (create_list) con la fábrica;

4) ''elegir'' (muestra) una Organización de la lista con:

# Random select option = Organization.all.sample # Select the FIRST(0) by id option = Organization.all[0] # Select the SECOND(1) after some restriction option = Organization.where(some_attr: some_value)[2] option = Organization.where("some_attr OP some_value")[2] #OP is "=", "<", ">", so on...


Otra opción es agregar un método como este

def select_option(css_selector, value) find(:css, css_selector).find(:option, value).select_option end


Para agregar otra respuesta al montón (porque aparentemente hay tantas maneras de hacerlo dependiendo de su configuración) - Lo hice seleccionando el elemento de option literal y haciendo clic en él

find(".some-selector-for-dropdown option[value=''1234'']").select_option

No es muy bonito, pero funciona: /


Por alguna razón, no funcionó para mí. Entonces usé algo más

select "option_name_here", :from => "organizationSelect"

trabajó para mi.


Si echas un vistazo al origen del método de select , puedes ver que lo que hace cuando pasas una tecla from es esencialmente:

find(:select, from, options).find(:option, value, options).select_option

En otras palabras, encuentra la <select> que está interesado, luego encuentra la <option> dentro de eso, luego llama a select_option en el nodo <option> .

Ya casi has hecho las dos primeras cosas, simplemente las reorganizaría. Luego puede virar el método select_option al final:

find(''#organizationSelect'').find(:xpath, ''option[2]'').select_option


ninguna de las respuestas funcionó para mí en 2017 con capibara 2.7. Obtuve "ArgumentError: número de argumentos incorrecto (dado 2, esperado 0)"

Pero esto hizo:

find(''#organizationSelect'').all(:css, ''option'').find { |o| o.value == ''option_name_here'' }.select_option