¿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

        }
}

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í


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.


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.


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

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

2

Solo necesita pasar el valor e ingresar la clave:

driver.FindElement(By.Name("education")).SendKeys("Jr.High"+Keys.Enter);

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

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

0
 var select = new SelectElement(elementX);
 select.MoveToElement(elementX).Build().Perform();

  var click = (
       from sel in select
       let value = "College"
       select value
       );

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

Funciona con selecciones de
listas
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.