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>
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)
inputElementFruits.send_keys(...)
mais cela n'a pas fonctionné.À 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
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:
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)
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)
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
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é.
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()
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);
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.