2011-10-23 43 views
68

Necesito seleccionar un elemento de un menú desplegable.Selenio - Python - valor de la opción del menú desplegable

Por ejemplo, abra la siguiente:

<select id="fruits01" class="select" name="fruits"> 
    <option value="0">Choose your fruits:</option> 
    <option value="1">Banana</option> 
    <option value="2">Mango</option> 
</select> 
  1. Así que primero tengo que hacer clic en él. Hago esto:

    inputElementFruits = driver.find_element_by_xpath("//select["id='fruits']).click() 
    

(bien, que es abrir el menú)

  1. Y después tengo que seleccionar el elemento bueno, digamos Mango. Intento algo diferente con inputElementFruits.send_keys(...) pero no funcionó.

Respuesta

49

A menos que su clic esté ejecutando una especie de llamada ajax para completar su lista, no es necesario ejecutar el clic.

Simplemente encuentre el elemento y luego enumere las opciones, seleccionando la (s) opción (es) que desea.

Aquí se muestra un ejemplo:

from selenium import webdriver 
b = webdriver.Firefox() 
b.find_element_by_xpath("//select[@name='element_name']/option[text()='option_text']").click() 

Puede leer más en:
https://sqa.stackexchange.com/questions/1355/unable-to-select-an-option-using-seleniums-python-webdriver

+7

Para su información, el uso de 'clase Select' hace que el problema mucho más fácil de resolver, ver la respuesta que he publicado. – alecxe

+0

¿Qué hago si uso 'find_by_id'? ¿Cómo proporciono el valor? Además, ¿cómo encuentro el 'xpath' de un elemento? –

118

selenio proporciona un cómodo Select class trabajar con select -> option construcciones:

from selenium import webdriver 
from selenium.webdriver.support.ui import Select 

driver = webdriver.Firefox() 
driver.get('url') 

select = Select(driver.find_element_by_id('fruits01')) 

# select by visible text 
select.select_by_visible_text('Banana') 

# select by value 
select.select_by_value('1') 

Véase también:

+0

Este es un gran camino a seguir, y debería ser el método de facto. Sin embargo, señalaré que es posible que deba usar la versión más obtusa de "xpath" si el autor del formulario no ha configurado correctamente un elemento HTML seleccionado. Si simplemente usa los campos de entrada, xpath debería funcionar. – Matthew

0

La mejor manera de utilizar selenium.webdriver.support.ui.Select clase para trabajar con la selección de menú desplegable, pero algún tiempo que no funciona como se esperaba debido al diseño de tema u otros temas del HTML.

En este tipo de situación también se puede preferir como solución alternativa usando execute_script() de la siguiente manera: -

option_visible_text = "Banana" 
select = driver.find_element_by_id("fruits01") 

#now use this to select option from dropdown by visible text 
driver.execute_script("var select = arguments[0]; for(var i = 0; i < select.options.length; i++){ if(select.options[i].text == arguments[1]){ select.options[i].selected = true; } }", select, option_visible_text); 
2

He intentado un montón de muchas cosas, pero mi desplegables estaba dentro de una tabla y no era capaz de realizar una simple operación de selección. Solo la solución de abajo funcionó. Aquí estoy resaltando desplegables elem y presionando la flecha hacia abajo hasta llegar al valor deseado -

 #identify the drop down element 
     elem = browser.find_element_by_name(objectVal) 
     for option in elem.find_elements_by_tag_name('option'): 
      if option.text == value: 
       break 

      else: 
       ARROW_DOWN = u'\ue015' 
       elem.send_keys(ARROW_DOWN) 
0
from selenium.webdriver.support.ui import Select 
driver = webdriver.Ie(".\\IEDriverServer.exe") 
driver.get("https://test.com") 
select = Select(driver.find_element_by_xpath("""//input[@name='n_name']""")) 
select.select_by_index(2) 

no tendrán ningún problema

2

en primer lugar, es necesario importar la clase Seleccione y entonces usted necesita para crear el instancia de la clase Select. Después de crear la instancia de Seleccionar clase, puede realizar selecciones de métodos en esa instancia para seleccionar las opciones de la lista desplegable. Este es el código

from selenium.webdriver.support.select import Select 

select_fr = Select(driver.find_element_by_id("fruits01") 
select_fr.select_by_index(0) 
Cuestiones relacionadas