Jak wybrać opcję z listy rozwijanej za pomocą Selenium WebDriver C #?

87

Próbowałem przeprowadzić test internetowy, wybierając opcję. Przykład można znaleźć tutaj: http://www.tizag.com/phpT/examples/formex.php

Wszystko działa świetnie poza wyborem części opcji. Jak wybrać opcję według wartości lub etykiety?

Mój kod:

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
źródło

Odpowiedzi:

185

Musisz utworzyć obiekt elementu wyboru z listy rozwijanej.

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

Więcej informacji tutaj

Matthew Kelly
źródło
działa jak urok, dzięki! to przyspiesza moje testy!
mirza
Jest błąd. var selectElement = new SelectElement(education);Powinno być:var selectElement = new SelectElement(element);
Greg Gauthier
52
Do Twojej wiadomości: aby użyć elementu Select, musisz dołączyć pakiet Selenium Webdriver Support, który jest innym pakietem NuGet niż Selenium WebDriver. Uwzględnij przestrzeń nazw OpenQA.Selenium.Support.UI.
James Lawruk
Używam sterownika firefox, selenu w wersji 2.53.1 i biblioteki wsparcia 2.53, SelectByText wydaje się nie działać. Jestem w stanie zobaczyć wszystkie opcje. Nawet jeśli iteracyjne opcje i ustawić właściwą wartość, wartość nie jest coraz set..Any pomocy byłoby świetnie
Viswas Menon
3
Czy wypróbowałeś inne sterowniki czy tylko przeglądarkę Firefox? Ponadto nazwa techniczna pakietu to obecnie Selenium.Support.
Dan Csharpster
13

Dodając do tego punkt - natrafiłem na problem polegający na tym, że przestrzeń nazw OpenQA.Selenium.Support.UI nie była dostępna po zainstalowaniu wiązania Selenium.NET w projekcie C #. Później dowiedziałem się, że możemy łatwo zainstalować najnowszą wersję Selenium WebDriver Support Classes, uruchamiając polecenie:

Install-Package Selenium.Support

w konsoli Menedżera pakietów NuGet lub zainstaluj Selenium.Support z Menedżera NuGet.

Ravishankar S.
źródło
9

Innym sposobem może być ten:

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

i możesz zmienić indeks w opcji [x] zmieniając x o liczbę elementów, które chcesz zaznaczyć.

Nie wiem, czy to najlepszy sposób, ale mam nadzieję, że to pomoże.

Juan
źródło
Nie jestem pewien, czy to działa przez cały czas. Ktoś zrobił to w ten sposób i to nie zadziałało i skończyło się na tym, że musiałem zmienić kod na kod sugerowany przez Matthew Locka
Fractal
3

Aby wybrać opcję przez tekst;

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

Aby wybrać opcję za pomocą wartości:

 (new SelectElement(driver.FindElement(By.XPath(""))).SelectByValue("");
Madhu
źródło
3

Kod Selenium WebDriver C # do wybierania elementu z listy rozwijanej:

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

Istnieją 3 sposoby wyboru pozycji z listy rozwijanej: i) Wybierz według tekstu ii) Wybierz według indeksu iii) Wybierz według wartości

Wybierz według tekstu:

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

Wybierz według indeksu:

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

Wybierz według wartości:

SelectAnEducation.SelectByValue("College");//There are 3 values - Jr.High, HighSchool, College
Ripon Al Wasim
źródło
2

Wystarczy podać wartość i wprowadzić klucz:

driver.FindElement(By.Name("education")).SendKeys("Jr.High"+Keys.Enter);
Vineet Patel
źródło
Prawdopodobnie zakończy się niepowodzeniem, jeśli lista rozwijana zawiera wiele opcji z podobnymi tekstami.
Antti
1

Tak to działa u mnie (wybierając sterowanie przez ID i opcję przez tekst):

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

posługiwać się:

clickOptionInList("ctl00_ContentPlaceHolder_lbxAllRoles", "Tester");
serop
źródło
0

Jeśli szukasz dowolnego elementu z listy rozwijanej, bardzo przydatna jest również metoda „wybierz według indeksu”.

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
źródło
0
 var select = new SelectElement(elementX);
 select.MoveToElement(elementX).Build().Perform();

  var click = (
       from sel in select
       let value = "College"
       select value
       );
Code Disciple
źródło
4
Dodaj wyjaśnienie do swojego kodu: dlaczego jest odpowiedzią na pytanie i czym różni się od wcześniej podanych odpowiedzi?
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
źródło
Działa z opcjami listy rozwijanej
James