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

        }
}

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


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.


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.


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

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

2

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

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

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

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

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

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

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

Fonctionne avec les sélections de liste déroulante
James
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.