103

I was trying for my web test selecting an option. An example can be found here: http://www.tizag.com/phpT/examples/formex.php

Everything works great except the selecting an option part. How to selecting an option by value or by label?

My Code:

using OpenQA.Selenium.Firefox;
using OpenQA.Selenium;
using System.Collections.ObjectModel;
using System.Text.RegularExpressions;
using System.Threading;
using System.Diagnostics;
using System.Runtime.InteropServices;

class GoogleSuggest
{
    static void Main()
    {
        IWebDriver driver = new FirefoxDriver();

        //Notice navigation is slightly different than the Java version
        //This is because 'get' is a keyword in C#
        driver.Navigate().GoToUrl("http://www.tizag.com/phpT/examples/formex.php");
        IWebElement query = driver.FindElement(By.Name("Fname"));
        query.SendKeys("John");
        driver.FindElement(By.Name("Lname")).SendKeys("Doe");
        driver.FindElement(By.XPath("//input[@name='gender' and @value='Male']")).Click();
        driver.FindElement(By.XPath("//input[@name='food[]' and @value='Chicken']")).Click();
        driver.FindElement(By.Name("quote")).Clear();
        driver.FindElement(By.Name("quote")).SendKeys("Be Present!");
        driver.FindElement(By.Name("education")).SendKeys(Keys.Down + Keys.Enter); // working but that's not what i was looking for
        // driver.FindElement(By.XPath("//option[@value='HighSchool']")).Click(); not working
        //  driver.FindElement(By.XPath("/html/body/table[2]/tbody/tr/td[2]/table/tbody/tr/td/div[5]/form/select/option[2]")).Click(); not working
        // driver.FindElement(By.XPath("id('examp')/x:form/x:select[1]/x:option[2]")).Click(); not working

        }
}
John Smith
  • 7,243
  • 6
  • 49
  • 61
mirza
  • 5,685
  • 10
  • 43
  • 73

10 Answers10

213

You must create a select element object from the drop down list.

 using OpenQA.Selenium.Support.UI;

 // select the drop down list
 var education = driver.FindElement(By.Name("education"));
 //create select element object 
 var selectElement = new SelectElement(education);

 //select by value
 selectElement.SelectByValue("Jr.High"); 
 // select by text
 selectElement.SelectByText("HighSchool");

More info here

Matthew Lock
  • 13,144
  • 12
  • 92
  • 130
Matthew Kelly
  • 3,094
  • 1
  • 19
  • 10
  • There is a bug. `var selectElement = new SelectElement(education);` Should be: `var selectElement = new SelectElement(element);` – Greg Gauthier Jun 15 '11 at 22:50
  • 61
    FYI: To use a Select Element, you need to include the Selenium Webdriver Support package which is a different NuGet package than the Selenium WebDriver. Include the namespace OpenQA.Selenium.Support.UI. – James Lawruk May 28 '13 at 19:33
  • I'm using the firefox driver , selenium version 2.53.1 and support library 2.53 , The SelectByText doesnt seem to be working. Im able to see all the options . Even if i iterate the options and set the correct value, The value is not getting set..Any help would be great – Viswas Menon Aug 09 '16 at 10:14
  • 3
    Did you try other drivers or just Firefox? Also, the package's technical name is currently Selenium.Support. – Dan Csharpster Apr 21 '19 at 12:58
  • This worked great for me, had to add the Selenium.Support NuGet as well. – Ray K Jun 21 '20 at 14:47
17

Adding a point to this- I came across a problem that OpenQA.Selenium.Support.UI namespace was not available after installing Selenium.NET binding into the C# project. Later found out that we can easily install latest version of Selenium WebDriver Support Classes by running the command:

Install-Package Selenium.Support

in NuGet Package Manager Console, or install Selenium.Support from NuGet Manager.

John Smith
  • 7,243
  • 6
  • 49
  • 61
Ravishankar S
  • 335
  • 4
  • 5
11

Other way could be this one:

driver.FindElement(By.XPath(".//*[@id='examp']/form/select[1]/option[3]")).Click();

and you can change the index in option[x] changing x by the number of element that you want to select.

I don't know if it is the best way but I hope that help you.

Kirk Woll
  • 76,112
  • 22
  • 180
  • 195
Juan
  • 111
  • 1
  • 2
  • I'm not sure this works all the time. Someone did it this way and it didn't work and I ended up having to change to code to the code suggested by Matthew Lock – Fractal Apr 29 '19 at 16:05
5

Selenium WebDriver C# code for selecting item from Drop Down:

IWebElement EducationDropDownElement = driver.FindElement(By.Name("education"));
SelectElement SelectAnEducation = new SelectElement(EducationDropDownElement);

There are 3 ways to select drop down item: i)Select by Text ii) Select by Index iii) Select by Value

Select by Text:

SelectAnEducation.SelectByText("College");//There are 3 items - Jr.High, HighSchool, College

Select by Index:

SelectAnEducation.SelectByIndex(2);//Index starts from 0. so, 0 = Jr.High 1 = HighSchool 2 = College

Select by Value:

SelectAnEducation.SelectByValue("College");//There are 3 values - Jr.High, HighSchool, College
Ripon Al Wasim
  • 36,924
  • 42
  • 155
  • 176
4

To Select an Option Via Text;

(new SelectElement(driver.FindElement(By.XPath(""))).SelectByText("");

To Select an Option via Value:

 (new SelectElement(driver.FindElement(By.XPath(""))).SelectByValue("");
Matt
  • 14,906
  • 27
  • 99
  • 149
Madhu
  • 479
  • 4
  • 10
2

You just need to pass the value and enter key:

driver.FindElement(By.Name("education")).SendKeys("Jr.High"+Keys.Enter);
Nic Wortel
  • 11,155
  • 6
  • 60
  • 79
1

This is how it works for me (selecting control by ID and option by text):

protected void clickOptionInList(string listControlId, string optionText)
{
     driver.FindElement(By.XPath("//select[@id='"+ listControlId + "']/option[contains(.,'"+ optionText +"')]")).Click();
}

use:

clickOptionInList("ctl00_ContentPlaceHolder_lbxAllRoles", "Tester");
serop
  • 1,138
  • 12
  • 13
0

If you are looking for just any selection from the drop-down box, I also find "select by index" method very useful.

if (IsElementPresent(By.XPath("//select[@id='Q43_0']")))
{
    new SelectElement(driver.FindElement(By.Id("Q43_0")))**.SelectByIndex(1);** // This is selecting first value of the drop-down list
    WaitForAjax();
    Thread.Sleep(3000);
}
else
{
     Console.WriteLine("Your comment here);
}
Unheilig
  • 16,196
  • 193
  • 68
  • 98
0
 var select = new SelectElement(elementX);
 select.MoveToElement(elementX).Build().Perform();

  var click = (
       from sel in select
       let value = "College"
       select value
       );
Petter Friberg
  • 21,252
  • 9
  • 60
  • 109
  • 4
    Please add an explanation to your code: _why_ is it an answer to the question and _what makes it different_ from the earlier given answers? – Nander Speerstra Sep 20 '17 at 09:24
0
IWebElement element = _browserInstance.Driver.FindElement(By.XPath("//Select"));
IList<IWebElement> AllDropDownList = element.FindElements(By.XPath("//option"));
int DpListCount = AllDropDownList.Count;
for (int i = 0; i < DpListCount; i++)
{
    if (AllDropDownList[i].Text == "nnnnnnnnnnn")
    {
        AllDropDownList[i].Click();
        _browserInstance.ScreenCapture("nnnnnnnnnnnnnnnnnnnnnn");
    }
}
Syscall
  • 19,327
  • 10
  • 37
  • 52
james
  • 1