How to select a drop-down menu value with Selenium using Python?

PythonSeleniumSelenium WebdriverWebdriverHtml Select

Python Problem Overview


I need to select an element from a drop-down menu.

For example:

<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) First I have to click on it. I do this:

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

2) After that I have to select the good element, lets say Mango.

I tried to do it with inputElementFruits.send_keys(...) but it did not work.

Python Solutions


Solution 1 - Python

Selenium provides a convenient Select class to work with select -> option constructs:

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

See also:

Solution 2 - Python

Unless your click is firing some kind of ajax call to populate your list, you don't actually need to execute the click.

Just find the element and then enumerate the options, selecting the option(s) you want.

Here is an example:

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

You can read more in:
https://sqa.stackexchange.com/questions/1355/unable-to-select-an-option-using-seleniums-python-webdriver

Solution 3 - Python

I hope this code will help you.

from selenium.webdriver.support.ui import Select

dropdown element with id

ddelement= Select(driver.find_element_by_id('id_of_element'))

dropdown element with xpath

ddelement= Select(driver.find_element_by_xpath('xpath_of_element'))

dropdown element with css selector

ddelement= Select(driver.find_element_by_css_selector('css_selector_of_element'))

Selecting 'Banana' from a dropdown

  1. Using the index of dropdown

ddelement.select_by_index(1)

  1. Using the value of dropdown

ddelement.select_by_value('1')

  1. You can use match the text which is displayed in the drop down.

ddelement.select_by_visible_text('Banana')

Solution 4 - Python

firstly you need to import the Select class and then you need to create the instance of Select class. After creating the instance of Select class, you can perform select methods on that instance to select the options from dropdown list. Here is the code

from selenium.webdriver.support.select import Select

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


                         

Solution 5 - Python

As per the HTML provided:

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

To select an <option> element from a [tag:html-select] menu you have to use the Select Class. Moreover, as you have to interact with the [tag:drop-down-menu] you have to induce WebDriverWait for the element_to_be_clickable().

To select the <option> with text as Mango from the [tag:dropdown] you can use you can use either of the following Locator Strategies:

  • Using ID attribute and select_by_visible_text() method:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import Select
    
    select = Select(WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "fruits01"))))
    select.select_by_visible_text("Mango")
    
  • Using CSS-SELECTOR and select_by_value() method:

    select = Select(WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "select.select[name='fruits']"))))
    select.select_by_value("2")
    
  • Using XPATH and select_by_index() method:

    select = Select(WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "//select[@class='select' and @name='fruits']"))))
    select.select_by_index(2)
    

Solution 6 - Python

I tried a lot many things, but my drop down was inside a table and I was not able to perform a simple select operation. Only the below solution worked. Here I am highlighting drop down elem and pressing down arrow until getting the desired value -

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

Solution 7 - Python

You don't have to click anything. Use find by xpath or whatever you choose and then use send keys

For your example: 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")

That's it.

Solution 8 - Python

You can use a css selector combination a well

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

Change the 1 in the attribute = value css selector to the value corresponding with the desired fruit.

Solution 9 - Python

In this way you can select all the options in any dropdowns.

driver.get("https://www.spectrapremium.com/en/aftermarket/north-america")

print( "The title is  : " + driver.title)

inputs = Select(driver.find_element_by_css_selector('#year'))

input1 = len(inputs.options)

for items in range(input1):

    inputs.select_by_index(items)
    time.sleep(1)

Solution 10 - Python

It works with option value:

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

Solution 11 - Python

I use this for all of my clicks and selecting and it always works. For a dropdown item just make sure the xpath is the actual value you want to select.

var = WebDriverWait(driver, explicit_wait_seconds).until(
        EC.element_to_be_clickable((By.XPATH, self)))
    # added the click here.
    ActionChains(driver).move_to_element(var).click()
    perform_actions()

actions.perform()
 # Reset was required to clear it. Might be patched now.
actions.reset_actions()
for device in actions.w3c_actions.devices:
    device.clear_actions()

Solution 12 - Python

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)

It will work fine

Solution 13 - Python

Dropdown WITHOUT <select>

This works for me every time I face a dropdown without <select> tags

# Finds the dropdown option by its text
driver.find_element_by_xpath("//*[text()='text of the option']")

Import ActionChains module

from selenium.webdriver.common.action_chains import ActionChains

Use ActionChains to click on the element

drp_element = driver.find_element_by_xpath("//*[text()='text of the option']")
action = ActionChains(driver)
action.click(on_element=drp_element).perform()

Solution 14 - Python

After going through a lot of posts like this one, I managed to figure out a solution that allowed me to select an item in a dropdown. I tried .send_keys, click(), and Select in various ways with no success. Ended up sending the click() command to the dropdown 3 times before clicking on the item in the dropdown.

dropMenu = browser.find_element_by_id('cmbDeviceType')
dropMenu.click()
dropMenu.click()
dropMenu.click()

deviceType = browser.find_element_by_id('cmbDeviceType_DDD_L_LBI16T0')
deviceType.click()

Definitely not super pretty, but it works.

Hope this helps someone. This was done with Python3.7.7 on Firefox 88.0.1.

Solution 15 - Python

The best way to use selenium.webdriver.support.ui.Select class to work to with dropdown selection but some time it does not work as expected due to designing issue or other issues of the HTML.

In this type of situation you can also prefer as alternate solution using execute_script() as below :-

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

Solution 16 - Python

dropdown1 = Select(driver.find_element_by_name("fruits"))
dropdown1.select_by_visible_text('banana')

Solution 17 - Python

  1. List item

public class ListBoxMultiple {

public static void main(String[] args) throws InterruptedException {
	// TODO Auto-generated method stub
	System.setProperty("webdriver.chrome.driver", "./drivers/chromedriver.exe");
	WebDriver driver=new ChromeDriver();
	driver.get("file:///C:/Users/Amitabh/Desktop/hotel2.html");//open the website
	driver.manage().window().maximize();
	
	
	WebElement hotel = driver.findElement(By.id("maarya"));//get the element
	
	Select sel=new Select(hotel);//for handling list box
	//isMultiple
	if(sel.isMultiple()){
		System.out.println("it is multi select list");
	}
	else{
		System.out.println("it is single select list");
	}
	//select option
	sel.selectByIndex(1);// you can select by index values
	sel.selectByValue("p");//you can select by value
	sel.selectByVisibleText("Fish");// you can also select by visible text of the options
	//deselect option but this is possible only in case of multiple lists
	Thread.sleep(1000);
	sel.deselectByIndex(1);
	sel.deselectAll();
	
	//getOptions
	List<WebElement> options = sel.getOptions();
	
	int count=options.size();
	System.out.println("Total options: "+count);
	
	for(WebElement opt:options){ // getting text of every elements
		String text=opt.getText();
		System.out.println(text);
		}
	
	//select all options
	for(int i=0;i<count;i++){
		sel.selectByIndex(i);
		Thread.sleep(1000);
	}
	
	driver.quit();

}

}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAdam BovienView Question on Stackoverflow
Solution 1 - PythonalecxeView Answer on Stackoverflow
Solution 2 - PythonalanningView Answer on Stackoverflow
Solution 3 - Pythontvs89View Answer on Stackoverflow
Solution 4 - PythonVaibhavView Answer on Stackoverflow
Solution 5 - Pythonundetected SeleniumView Answer on Stackoverflow
Solution 6 - PythonAbhinav BhatnagarView Answer on Stackoverflow
Solution 7 - PythonShane CheekView Answer on Stackoverflow
Solution 8 - PythonQHarrView Answer on Stackoverflow
Solution 9 - PythonRaza ul MustafaView Answer on Stackoverflow
Solution 10 - PythonJackssnView Answer on Stackoverflow
Solution 11 - PythonJohn CarrView Answer on Stackoverflow
Solution 12 - PythonKuladipView Answer on Stackoverflow
Solution 13 - PythonHerkerView Answer on Stackoverflow
Solution 14 - PythonSamsungSeizureView Answer on Stackoverflow
Solution 15 - PythonSaurabh GaurView Answer on Stackoverflow
Solution 16 - PythonPriyanka TesterView Answer on Stackoverflow
Solution 17 - Pythonamitabh sinhaView Answer on Stackoverflow