¿Cómo seleccionar una opción del menú desplegable usando Selenium WebDriver C #?

87

Estaba intentando realizar mi prueba web seleccionando una opción. Puede encontrar un ejemplo aquí: http://www.tizag.com/phpT/examples/formex.php

Todo funciona muy bien, excepto la selección de una parte de opción. ¿Cómo seleccionar una opción por valor o por etiqueta?

Mi código:

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

        }
}
mirza
fuente

Respuestas:

185

Debe crear un objeto de elemento de selección de la lista desplegable.

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

Más info aquí

Matthew Kelly
fuente
funciona como un encanto gracias! ¡Eso hace que las cosas sean más rápidas para mis pruebas!
mirza
Hay un error. var selectElement = new SelectElement(education);Debería ser:var selectElement = new SelectElement(element);
Greg Gauthier
52
Para su información: para usar un elemento de selección, debe incluir el paquete de soporte de Selenium Webdriver, que es un paquete NuGet diferente al de Selenium WebDriver. Incluya el espacio de nombres OpenQA.Selenium.Support.UI.
James Lawruk
Estoy usando el controlador de Firefox, la versión de selenium 2.53.1 y la biblioteca de soporte 2.53, el SelectByText no parece estar funcionando. Puedo ver todas las opciones. Incluso si itero las opciones y establezco el valor correcto, el valor no se está estableciendo ... Cualquier ayuda sería genial
Viswas Menon
3
¿Probaste con otros controladores o solo con Firefox? Además, el nombre técnico del paquete es actualmente Selenium.Support.
Dan Csharpster
13

Agregando un punto a esto: me encontré con un problema de que el espacio de nombres OpenQA.Selenium.Support.UI no estaba disponible después de instalar el enlace Selenium.NET en el proyecto C #. Más tarde descubrí que podemos instalar fácilmente la última versión de las clases de soporte de Selenium WebDriver ejecutando el comando:

Install-Package Selenium.Support

en NuGet Package Manager Console, o instale Selenium.Support desde NuGet Manager.

Ravishankar S
fuente
9

Otra forma podría ser esta:

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

y puede cambiar el índice en la opción [x] cambiando x por el número de elemento que desea seleccionar.

No sé si es la mejor manera pero espero que te ayude.

Juan
fuente
No estoy seguro de que esto funcione todo el tiempo. Alguien lo hizo de esta manera y no funcionó y terminé teniendo que cambiar el código al código sugerido por Matthew Lock
Fractal
3

Para seleccionar una opción a través de texto;

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

Para seleccionar una opción a través del valor:

 (new SelectElement(driver.FindElement(By.XPath(""))).SelectByValue("");
Madhu
fuente
3

Código Selenium WebDriver C # para seleccionar un elemento del menú desplegable:

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

Hay 3 formas de seleccionar un elemento desplegable: i) Seleccionar por texto ii) Seleccionar por índice iii) Seleccionar por valor

Seleccionar por texto:

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

Seleccionar por índice:

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

Seleccionar por valor:

SelectAnEducation.SelectByValue("College");//There are 3 values - Jr.High, HighSchool, College
Ripon Al Wasim
fuente
2

Solo necesita pasar el valor e ingresar la clave:

driver.FindElement(By.Name("education")).SendKeys("Jr.High"+Keys.Enter);
Vineet Patel
fuente
Es probable que falle si el menú desplegable contiene varias opciones con textos similares.
Antti
1

Así es como funciona para mí (seleccionando control por ID y opción por texto):

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

utilizar:

clickOptionInList("ctl00_ContentPlaceHolder_lbxAllRoles", "Tester");
serop
fuente
0

Si está buscando cualquier selección del cuadro desplegable, también encuentro muy útil el método "seleccionar por índice".

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);
}
usuario6164019
fuente
0
 var select = new SelectElement(elementX);
 select.MoveToElement(elementX).Build().Perform();

  var click = (
       from sel in select
       let value = "College"
       select value
       );
Discípulo del Código
fuente
4
Agregue una explicación a su código: ¿por qué es una respuesta a la pregunta y qué la hace diferente de las respuestas dadas anteriormente?
Nander Speerstra
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");
    }
}
James
fuente
Funciona con selecciones de
listas