Come selezionare un'opzione dal menu a discesa utilizzando Selenium WebDriver C #?


87

Stavo provando il mio test web selezionando un'opzione. Un esempio può essere trovato qui: http://www.tizag.com/phpT/examples/formex.php

Tutto funziona alla grande tranne la selezione di una parte di opzione. Come selezionare un'opzione in base al valore o all'etichetta?

Il mio codice:

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

        }
}

Risposte:


188

È necessario creare un oggetto elemento di selezione dall'elenco a discesa.

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

Maggiori info qui


C'è un bug. var selectElement = new SelectElement(education);Dovrebbe essere:var selectElement = new SelectElement(element);
Greg Gauthier

52
FYI: per utilizzare un elemento di selezione, è necessario includere il pacchetto Selenium Webdriver Support, che è un pacchetto NuGet diverso da Selenium WebDriver. Includere lo spazio dei nomi OpenQA.Selenium.Support.UI.
James Lawruk

Sto usando il driver per Firefox, la versione 2.53.1 del selenio e la libreria di supporto 2.53, il SelectByText non sembra funzionare. Sono in grado di vedere tutte le opzioni. Anche se itero le opzioni e imposto il valore corretto, il valore non viene impostato .. Qualsiasi aiuto sarebbe ottimo
Viswas Menon

3
Hai provato altri driver o solo Firefox? Inoltre, il nome tecnico del pacchetto è attualmente Selenium.Support.
Dan Csharpster

Questo ha funzionato alla grande per me, ho dovuto aggiungere il selenio. Supporta anche NuGet.
Ray K

13

Aggiungendo un punto a questo: mi sono imbattuto in un problema che lo spazio dei nomi OpenQA.Selenium.Support.UI non era disponibile dopo l'installazione dell'associazione Selenium.NET nel progetto C #. Successivamente abbiamo scoperto che possiamo facilmente installare l'ultima versione di Selenium WebDriver Support Classes eseguendo il comando:

Install-Package Selenium.Support

nella console di Gestione pacchetti NuGet o installare Selenium.Support da NuGet Manager.


9

Un altro modo potrebbe essere questo:

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

e puoi cambiare l'indice nell'opzione [x] cambiando x per il numero di elementi che vuoi selezionare.

Non so se sia il modo migliore, ma spero che ti aiuti.


Non sono sicuro che funzioni sempre. Qualcuno lo ha fatto in questo modo e non ha funzionato e ho finito per dover cambiare codice con il codice suggerito da Matthew Lock
Fractal

3

Per selezionare un'opzione tramite testo;

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

Per selezionare un'opzione tramite Valore:

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

3

Codice C # Selenium WebDriver per selezionare l'elemento dal menu a discesa:

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

Ci sono 3 modi per selezionare un elemento a discesa: i) Seleziona per testo ii) Seleziona per indice iii) Seleziona per valore

Seleziona per testo:

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

Seleziona per indice:

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

Seleziona per valore:

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

2

Devi solo passare il valore e inserire la chiave:

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

Probabilmente fallirà se il menu a discesa contiene più opzioni con testi simili.
Antti

1

Ecco come funziona per me (selezionando il controllo per ID e l'opzione per testo):

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

uso:

clickOptionInList("ctl00_ContentPlaceHolder_lbxAllRoles", "Tester");

0

Se stai cercando una selezione qualsiasi dalla casella a discesa, trovo anche molto utile il metodo "seleziona per indice".

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
Si prega di aggiungere una spiegazione al codice: perché è una risposta alla domanda e cosa lo rende diverso dalle risposte fornite in precedenza?
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");
    }
}

Funziona con le selezioni dell'elenco a discesa
james
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.