Wie wähle ich mit Selenium WebDriver C # eine Option aus der Dropdown-Liste aus?

86

Ich habe versucht, für meinen Webtest eine Option auszuwählen. Ein Beispiel finden Sie hier: http://www.tizag.com/phpT/examples/formex.php

Alles funktioniert gut, bis auf die Auswahl eines Optionsteils. Wie wähle ich eine Option nach Wert oder Bezeichnung aus?

Mein 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
quelle

Antworten:

180

Sie müssen ein Auswahlelementobjekt aus der Dropdown-Liste erstellen.

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

Mehr Infos hier

Matthew Kelly
quelle
funktioniert wie ein Zauber danke! das macht die Dinge für meine Tests schneller!
Mirza
Es gibt einen Fehler. var selectElement = new SelectElement(education);Sollte sein:var selectElement = new SelectElement(element);
Greg Gauthier
51
Zu Ihrer Information: Um ein Select-Element zu verwenden, müssen Sie das Selenium Webdriver-Support-Paket einschließen, das ein anderes NuGet-Paket als der Selenium WebDriver ist. Fügen Sie den Namespace OpenQA.Selenium.Support.UI ein.
James Lawruk
Ich verwende den Firefox-Treiber, Selenium Version 2.53.1 und die Support-Bibliothek 2.53. Der SelectByText scheint nicht zu funktionieren. Ich kann alle Optionen sehen. Selbst wenn ich die Optionen iteriere und den richtigen Wert einstelle, wird der Wert nicht eingestellt. Jede Hilfe wäre großartig
Viswas Menon
3
Haben Sie andere Treiber oder nur Firefox ausprobiert? Außerdem lautet der technische Name des Pakets derzeit Selenium.Support.
Dan Csharpster
13

Ich habe einen Punkt hinzugefügt: Ich bin auf ein Problem gestoßen, dass der OpenQA.Selenium.Support.UI-Namespace nach der Installation der Selenium.NET-Bindung im C # -Projekt nicht verfügbar war. Später stellte sich heraus, dass wir die neueste Version der Selenium WebDriver-Supportklassen problemlos installieren können, indem wir den folgenden Befehl ausführen:

Install-Package Selenium.Support

in der NuGet Package Manager-Konsole oder installieren Sie Selenium.Support über NuGet Manager.

Ravishankar S.
quelle
9

Ein anderer Weg könnte dieser sein:

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

und Sie können den Index in Option [x] ändern, indem Sie x um die Anzahl der Elemente ändern, die Sie auswählen möchten.

Ich weiß nicht, ob es der beste Weg ist, aber ich hoffe, das hilft dir.

Juan
quelle
Ich bin mir nicht sicher, ob das die ganze Zeit funktioniert. Jemand hat es so gemacht und es hat nicht funktioniert und ich musste schließlich den Code auf den von Matthew Lock
Fractal am
3

So wählen Sie eine Option über Text aus;

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

So wählen Sie eine Option über Wert aus:

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

Sie müssen nur den Wert übergeben und den Schlüssel eingeben:

driver.FindElement(By.Name("education")).SendKeys("Jr.High"+Keys.Enter);
Vineet Patel
quelle
Wird wahrscheinlich fehlschlagen, wenn das Dropdown-Menü mehrere Optionen mit ähnlichen Texten enthält.
Antti
1

So funktioniert es bei mir (Auswahl der Steuerung nach ID und Option nach Text):

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

verwenden:

clickOptionInList("ctl00_ContentPlaceHolder_lbxAllRoles", "Tester");
serop
quelle
1

Selenium WebDriver C # -Code zum Auswählen eines Elements aus der Dropdown-Liste:

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

Es gibt drei Möglichkeiten, ein Dropdown-Element auszuwählen: i) Nach Text auswählen ii) Nach Index auswählen iii) Nach Wert auswählen

Nach Text auswählen:

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

Nach Index auswählen:

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

Nach Wert auswählen:

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

Wenn Sie nur nach einer Auswahl aus dem Dropdown-Feld suchen, finde ich auch die Methode "Nach Index auswählen" sehr nützlich.

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

  var click = (
       from sel in select
       let value = "College"
       select value
       );
Code Schüler
quelle
4
Bitte fügen Sie Ihrem Code eine Erklärung hinzu: Warum ist es eine Antwort auf die Frage und was unterscheidet sie von den zuvor gegebenen Antworten?
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
quelle
Funktioniert mit Dropdown-Listenauswahl
James