2011-03-11 19 views
51

Stavo cercando il test Web per selezionare un'opzione. Un esempio può essere trovato qui: http://www.tizag.com/phpT/examples/formex.phpCome selezionare un'opzione dal menu a tendina usando Selenium WebDriver C#?

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

My 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 

     } 
} 

risposta

113

È necessario creare un oggetto elemento di selezione dal menu a tendina.

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 informazioni here

+0

funziona come un fascino, grazie! questo rende le cose più veloci per i miei test! – motto

+0

C'è un bug. 'var selectElement = new SelectElement (education);' Dovrebbe essere: 'var selectElement = new SelectElement (elemento);' –

+1

@greg grazie, risolto che –

7

altro modo potrebbe essere questa:

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

ed è possibile modificare l'indice nell'opzione [x] cambiando x per il numero di elementi che si desidera selezionare.

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

1

Questo è come funziona per me (la selezione di controllo per ID e l'opzione per il 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

Hai solo bisogno di passare il valore e inserire la chiave:

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

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

3

Aggiunta di 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 del collegamento Selenium.NET nel progetto C#. Più tardi abbiamo scoperto che possiamo installare facilmente l'ultima versione di Classi di supporto Selenium WebDriver eseguendo il comando Install-Package Selenium.Support nella console NuGet Package Manager.

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

Se siete alla ricerca di un qualsiasi selezione dal menu a tendina, trovo anche "selezionare in base all'indice di" metodo molto 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); 
} 
1

Selenio WebDriver codice C# per la selezione di voce da Drop Down:

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

ci sono 3 modi per selezionare la voce discesa: i) Per Testo ii) Selezione per Indice iii) Selezione per Valore

Selezione per Testo:

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

Selezione per Index:

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

Selezione per valore:

SelectAnEducation.SelectByValue("College");//There are 3 values - Jr.High, HighSchool, College 
0
var select = new SelectElement(elementX); 
select.MoveToElement(elementX).Build().Perform(); 

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

Per favore aggiungi una spiegazione al tuo codice: _perché _ è una risposta alla domanda e _ cosa la rende diversa_ dalle risposte precedenti? –

Problemi correlati