Como selecionar uma opção da lista suspensa usando Selenium WebDriver C #?

87

Eu estava tentando fazer o meu teste da web selecionando uma opção. Um exemplo pode ser encontrado aqui: http://www.tizag.com/phpT/examples/formex.php

Tudo funciona bem, exceto a seleção de uma parte de opção. Como selecionar uma opção por valor ou por rótulo?

Meu código:

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
fonte

Respostas:

185

Você deve criar um objeto de elemento de seleção na lista suspensa.

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

Mais informações aqui

Matthew Kelly
fonte
funciona como um encanto obrigado! isso torna as coisas mais rápidas para meus testes!
mirza
Existe um bug. var selectElement = new SelectElement(education);Deve ser:var selectElement = new SelectElement(element);
Greg Gauthier
52
Para sua informação: para usar um Select Element, você precisa incluir o pacote Selenium Webdriver Support, que é um pacote NuGet diferente do Selenium WebDriver. Inclua o namespace OpenQA.Selenium.Support.UI.
James Lawruk
Estou usando o driver firefox, selenium versão 2.53.1 e a biblioteca de suporte 2.53, O SelectByText não parece estar funcionando. Eu consigo ver todas as opções. Mesmo se eu iterar as opções e definir o valor correto, o valor não está sendo definido ... Qualquer ajuda seria ótima
Viswas Menon
3
Você tentou outros drivers ou apenas o Firefox? Além disso, o nome técnico do pacote atualmente é Selenium.Support.
Dan Csharpster
13

Adicionando um ponto a isso - me deparei com um problema que o namespace OpenQA.Selenium.Support.UI não estava disponível após a instalação da ligação Selenium.NET no projeto C #. Mais tarde descobrimos que podemos instalar facilmente a versão mais recente das Classes de suporte do Selenium WebDriver executando o comando:

Install-Package Selenium.Support

no NuGet Package Manager Console ou instale o Selenium.Support do NuGet Manager.

Ravishankar S
fonte
9

Outra forma poderia ser esta:

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

e você pode alterar o índice na opção [x] alterando x pelo número do elemento que deseja selecionar.

Não sei se é a melhor forma mas espero que te ajude.

Juan
fonte
Não tenho certeza se isso funciona o tempo todo. Alguém fez assim e não funcionou e acabei tendo que mudar o código para o código sugerido por Matthew Lock
Fractal
3

Para selecionar uma opção por texto;

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

Para selecionar uma opção por meio do valor:

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

Código Selenium WebDriver C # para selecionar o item no menu suspenso:

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

Existem 3 maneiras de selecionar o item suspenso: i) Selecionar por texto ii) Selecionar por índice iii) Selecionar por valor

Selecione por texto:

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

Selecione por índice:

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

Selecione por valor:

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

Você só precisa passar o valor e inserir a chave:

driver.FindElement(By.Name("education")).SendKeys("Jr.High"+Keys.Enter);
Vineet Patel
fonte
Provavelmente falhará se o menu suspenso contiver várias opções com textos semelhantes.
Antti
1

É assim que funciona para mim (selecionando controle por ID e opção por texto):

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

usar:

clickOptionInList("ctl00_ContentPlaceHolder_lbxAllRoles", "Tester");
sorope
fonte
0

Se você estiver procurando por qualquer seleção da caixa suspensa, também acho o método "selecionar por índice" muito útil.

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

  var click = (
       from sel in select
       let value = "College"
       select value
       );
Discípulo do Código
fonte
4
Adicione uma explicação ao seu código: por que é uma resposta à pergunta e o que a torna diferente das respostas fornecidas anteriormente?
Nander Speerstra de
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
fonte
Funciona com seleções de lista suspensa
james