Как выбрать вариант из раскрывающегося списка с помощью Selenium WebDriver C #?

87

Я пробовал для своего веб-теста выбрать вариант. Пример можно найти здесь: http://www.tizag.com/phpT/examples/formex.php

Все работает отлично, кроме выбора опции. Как выбрать вариант по значению или по метке?

Мой код:

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

        }
}
Мирза
источник

Ответы:

185

Вы должны создать объект выбора элемента из раскрывающегося списка.

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

Больше информации здесь

Мэтью Келли
источник
работает как шарм, спасибо! это ускоряет мои тесты!
mirza
Есть ошибка. var selectElement = new SelectElement(education);Должно быть:var selectElement = new SelectElement(element);
Грег Готье
52
К вашему сведению: чтобы использовать элемент Select, вам необходимо включить пакет поддержки Selenium Webdriver, который представляет собой другой пакет NuGet, чем Selenium WebDriver. Включите пространство имен OpenQA.Selenium.Support.UI.
Джеймс Лорук
Я использую драйвер firefox, selenium версии 2.53.1 и библиотеку поддержки 2.53, SelectByText, похоже, не работает. Я вижу все варианты. Даже если я повторю варианты и установлю правильное значение, значение не будет установлено .. Любая помощь будет отличной
Висвас Менон,
3
Вы пробовали другие драйверы или просто Firefox? Кроме того, техническое название пакета в настоящее время - Selenium.Support.
Дэн Чарпстер
13

Добавляя к этому момент, я столкнулся с проблемой, что пространство имен OpenQA.Selenium.Support.UI было недоступно после установки привязки Selenium.NET в проект C #. Позже выяснилось, что мы можем легко установить последнюю версию классов поддержки Selenium WebDriver, выполнив команду:

Install-Package Selenium.Support

в консоли диспетчера пакетов NuGet или установите Selenium.Support из диспетчера NuGet.

Равишанкар С
источник
9

Другой способ мог быть таким:

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

и вы можете изменить индекс в опции [x], изменив x на количество элементов, которые вы хотите выбрать.

Не знаю, лучший ли это способ, но надеюсь, что это вам поможет.

Хуан
источник
Я не уверен, что это всегда работает. Кто-то сделал это таким образом, и это не сработало, и мне пришлось изменить код на код, предложенный Мэтью Локком
Fractal
3

Чтобы выбрать вариант с помощью текста;

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

Чтобы выбрать вариант по значению:

 (new SelectElement(driver.FindElement(By.XPath(""))).SelectByValue("");
Мадху
источник
3

Код Selenium WebDriver C # для выбора элемента из раскрывающегося списка:

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

Есть 3 способа выбрать раскрывающийся элемент: i) Выбрать по тексту ii) Выбрать по индексу iii) Выбрать по значению

Выбрать по тексту:

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

Выбрать по индексу:

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

Выбрать по значению:

SelectAnEducation.SelectByValue("College");//There are 3 values - Jr.High, HighSchool, College
Рипон Аль Васим
источник
2

Вам просто нужно передать значение и ввести ключ:

driver.FindElement(By.Name("education")).SendKeys("Jr.High"+Keys.Enter);
Винит Патель
источник
Скорее всего, не удастся, если раскрывающийся список содержит несколько вариантов с похожими текстами.
Антти
1

Вот как это работает у меня (выбор элемента управления по идентификатору и вариант по тексту):

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

использование:

clickOptionInList("ctl00_ContentPlaceHolder_lbxAllRoles", "Tester");
сероп
источник
0

Если вы ищете только любой вариант из раскрывающегося списка, я также считаю очень полезным метод «выбрать по индексу».

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
источник
0
 var select = new SelectElement(elementX);
 select.MoveToElement(elementX).Build().Perform();

  var click = (
       from sel in select
       let value = "College"
       select value
       );
Кодовый ученик
источник
4
Пожалуйста, добавьте пояснение к вашему коду: почему это ответ на вопрос и чем он отличается от приведенных ранее ответов?
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");
    }
}
Джеймс
источник
Работает с выбором из выпадающего списка
Джеймс