web-dev-qa-db-fra.com

Selenium - Python - Valeur de l'option du menu déroulant

Je dois sélectionner un élément dans un menu déroulant.

Par exemple, ouvrez ceci: 

<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. Donc, je dois d'abord cliquer dessus. Je fais ça: 

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

(ok, ça ouvre le menu)

  1. Et après avoir sélectionné le bon élément, disons Mango. J'essaye la chose différente avec inputElementFruits.send_keys(...) mais cela n'a pas fonctionné.
105
Adam Bovien

À moins que votre clic ne déclenche une sorte d'appel ajax pour remplir votre liste, vous n'avez pas réellement besoin d'exécuter le clic.

Il suffit de trouver l'élément, puis d'énumérer les options, en sélectionnant les options souhaitées.

Voici un exemple:

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

Vous pouvez en lire plus dans: 
https://sqa.stackexchange.com/questions/1355/unable-to-select-an-option-using-seleniums-python-webdriver

76
alanning

Selenium fournit une classe Select à utiliser avec les constructions select -> option:

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')

Voir également:

197
alecxe

tout d'abord, vous devez importer la classe Select, puis créer l'instance de Select class . Après avoir créé l'instance de Select class, vous pouvez exécuter des méthodes de sélection sur cette instance pour sélectionner les options dans la liste déroulante . Voici le code

from Selenium.webdriver.support.select import Select

select_fr = Select(driver.find_element_by_id("fruits01"))
select_fr.select_by_index(0)
16
Vaibhav

J'ai essayé beaucoup de choses, mais ma liste déroulante se trouvait à l'intérieur d'une table et je ne pouvais pas effectuer une simple opération de sélection. Seule la solution ci-dessous a fonctionné. Ici, je mets en évidence drop elem et appuie sur la flèche jusqu'à obtenir la valeur souhaitée - 

        #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)
5
Abhinav Bhatnagar
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)

Ça fonctionnera bien

1
Kuladip

Vous pouvez utiliser une combinaison de sélecteur css un puits

driver.find_element_by_css_selector("#fruits01 [value='1']").click()

Remplacez le sélecteur 1 de l'attribut css = valeur par la valeur correspondant au fruit souhaité.

1
QHarr

Cela fonctionne avec la valeur d'option:

from Selenium import webdriver
b = webdriver.Firefox()
b.find_element_by_xpath("//select[@class='class_name']/option[@value='option_value']").click()
1
Jackssn

La meilleure façon d'utiliser la classe Selenium.webdriver.support.ui.Select pour travailler avec la sélection par liste déroulante, mais à un moment donné, elle ne fonctionne pas comme prévu en raison d'un problème de conception ou d'autres problèmes liés au code HTML.

Dans ce type de situation, vous pouvez également préférer une solution alternative en utilisant execute_script() comme ci-dessous: -

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);
0
Saurabh Gaur

Vous n'avez pas besoin de cliquer sur quoi que ce soit ... Utilisez "find by xpath" ou ce que vous choisissez, puis utilisez les touches d'envoi

Pour votre exemple: HTML:

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

Python:

fruit_field = browser.find_element_by_xpath("//input[@name='fruits']")
fruit_field.send_keys("Mango")

C'est tout.

0
Shane Cheek