How to select a drop-down menu option value with Selenium (Python)


Translate

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.



All Answers
  • Translate

    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


  • Translate

    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:


  • Translate

    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)
    

  • Translate

    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)
    

  • Translate

    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.


  • Translate

    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.


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


  • Translate

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

  • Translate

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

  • Translate
    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();
    
    }
    

    }