Comment sélectionner une option dans la liste déroulante à l'aide de Selenium WebDriver C #?

87

J'essayais de faire mon test Web en sélectionnant une option. Un exemple peut être trouvé ici: http://www.tizag.com/phpT/examples/formex.php

Tout fonctionne très bien sauf la sélection d'une pièce optionnelle. Comment sélectionner une option par valeur ou par étiquette?

Mon 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

        }
}
Mirza
la source

Réponses:

185

Vous devez créer un objet d'élément de sélection dans la liste déroulante.

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

Plus d'infos ici

Matthew Kelly
la source
fonctionne comme un charme merci! cela rend les choses plus rapides pour mes tests!
mirza
Il y a un bug. var selectElement = new SelectElement(education);Devrait être:var selectElement = new SelectElement(element);
Greg Gauthier le
52
Pour votre information: pour utiliser un élément Select, vous devez inclure le package Selenium Webdriver Support, qui est un package NuGet différent de celui de Selenium WebDriver. Incluez l'espace de noms OpenQA.Selenium.Support.UI.
James Lawruk
J'utilise le pilote firefox, le sélénium version 2.53.1 et la bibliothèque de support 2.53, le SelectByText ne semble pas fonctionner. Im capable de voir toutes les options. Même si j'itère les options et définit la valeur correcte, la valeur n'est pas définie .. Toute aide serait excellente
Viswas Menon
3
Avez-vous essayé d'autres pilotes ou simplement Firefox? De plus, le nom technique du package est actuellement Selenium.Support.
Dan Csharpster
13

En ajoutant un point à cela, je suis tombé sur un problème selon lequel l'espace de noms OpenQA.Selenium.Support.UI n'était pas disponible après l'installation de la liaison Selenium.NET dans le projet C #. Plus tard, nous avons découvert que nous pouvions facilement installer la dernière version des classes de support Selenium WebDriver en exécutant la commande:

Install-Package Selenium.Support

dans NuGet Package Manager Console ou installez Selenium.Support à partir de NuGet Manager.

Ravishankar S
la source
9

Une autre façon pourrait être celle-ci:

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

et vous pouvez changer l'index dans l'option [x] en changeant x par le nombre d'élément que vous voulez sélectionner.

Je ne sais pas si c'est le meilleur moyen mais j'espère que cela vous aidera.

Juan
la source
Je ne suis pas sûr que cela fonctionne tout le temps. Quelqu'un l'a fait de cette façon et cela n'a pas fonctionné et j'ai fini par devoir passer au code suggéré par Matthew Lock
Fractal
3

Pour sélectionner une option par texte;

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

Pour sélectionner une option via une valeur:

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

Code Selenium WebDriver C # pour sélectionner l'élément dans la liste déroulante:

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

Il existe 3 façons de sélectionner un élément déroulant: i) Sélectionner par texte ii) Sélectionner par index iii) Sélectionner par valeur

Sélectionnez par texte:

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

Sélectionnez par index:

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

Sélectionnez par valeur:

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

Il vous suffit de passer la valeur et d'entrer la clé:

driver.FindElement(By.Name("education")).SendKeys("Jr.High"+Keys.Enter);
Vineet Patel
la source
Échouera probablement si la liste déroulante contient plusieurs options avec des textes similaires.
Antti
1

Voici comment cela fonctionne pour moi (sélection du contrôle par ID et option par texte):

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

utilisation:

clickOptionInList("ctl00_ContentPlaceHolder_lbxAllRoles", "Tester");
serop
la source
0

Si vous recherchez n'importe quelle sélection dans la liste déroulante, je trouve également la méthode "sélectionner par index" très utile.

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

  var click = (
       from sel in select
       let value = "College"
       select value
       );
Disciple du code
la source
4
Veuillez ajouter une explication à votre code: pourquoi est-ce une réponse à la question et qu'est - ce qui la différencie des réponses précédentes?
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
la source
Fonctionne avec les sélections de liste déroulante
James