Como selecionar / obter a opção suspensa no Selenium 2

96

Estou convertendo meu código de selênio 1 em selênio 2 e não consigo encontrar uma maneira fácil de selecionar um rótulo em um menu suspenso ou obter o valor selecionado de um menu suspenso. Você sabe como fazer isso no Selenium 2?

Aqui estão duas declarações que funcionam no Selenium 1, mas não no 2:

browser.select("//path_to_drop_down", "Value1");
browser.getSelectedValue("//path_to_drop_down");
user786045
fonte
Você tentou localizá-lo usando o Firebug? Usar o xpath gerado com Firebug / xpather pode tornar isso mais fácil.
1
A questão não é localizar ou encontrar o dropdown. Trata-se de selecionar um rótulo nesse menu suspenso. Consigo localizar o menu suspenso, mas não sei qual método chamar no Selenium 2, pois select () e getSelectedValue () ou getSelectedLabel () não funcionam no Selenium 2.
user786045
Solução em c #: stackoverflow.com/questions/5278281/…
steve cook

Respostas:

184

Dê uma olhada na seção sobre preenchimento de formulários usando webdriver na documentação do selenium e o javadoc para a classe Select .

Para selecionar uma opção com base no rótulo:

Select select = new Select(driver.findElement(By.xpath("//path_to_drop_down")));
select.deselectAll();
select.selectByVisibleText("Value1");

Para obter o primeiro valor selecionado:

WebElement option = select.getFirstSelectedOption()
Janderssn
fonte
By.xpath ("// path_to_drop_down"). Eu substituiria isso por um localizador como By.name e assim por diante.
Daniel,
2
deselectAll lançará uma UnsupportedOperationException se a seleção não suportar várias seleções
Tom Hartwell
4
Em C #, use a classe SelectElement, então:SelectElement salesExecutiveDropDown = new SelectElement(webDriver.FindElement(By.Id("salesExecutiveId")));
Jeremy McGee
Fyi, este código não foi capaz de selecionar uma lista suspensa até que comentei esta linha: //select.deselectAll (); Então começou a funcionar. Sua milhagem pode variar.
gorbysbm
1
Observe que deselectAllsó é válido para multisseleção: selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/… .
user1205577
5
driver.findElement(By.id("id_dropdown_menu")).click();
driver.findElement(By.xpath("xpath_from_seleniumIDE")).click();

boa sorte

thrasher
fonte
4

em rubi para usar constantemente, adicione a seguir:

module Selenium
  module WebDriver
    class Element
      def select(value)
        self.find_elements(:tag_name => "option").find do |option|
          if option.text == value
            option.click
              return
           end
       end
    end
  end
end

e você poderá selecionar o valor:

browser.find_element(:xpath, ".//xpath").select("Value")
AlekseiPetrovski
fonte
3

Tente usar:

selenium.select("id=items","label=engineering")

ou

selenium.select("id=items","index=3")
coolcub
fonte
0

Uma opção semelhante ao que foi postado acima por janderson seria simplesmente usar o método .GetAttribute no selênio 2. Usando isso, você pode pegar qualquer item que tenha um valor ou rótulo específico que você está procurando. Isso pode ser usado para determinar se um elemento tem um rótulo, estilo, valor, etc. Uma maneira comum de fazer isso é percorrer os itens no menu suspenso até encontrar aquele que deseja e selecioná-lo. Em C #

int items = driver.FindElement(By.XPath("//path_to_drop_Down")).Count(); 
for(int i = 1; i <= items; i++)
{
    string value = driver.FindElement(By.XPath("//path_to_drop_Down/option["+i+"]")).GetAttribute("Value1");
    if(value.Conatains("Label_I_am_Looking_for"))
    {
        driver.FindElement(By.XPath("//path_to_drop_Down/option["+i+"]")).Click(); 
        //Clicked on the index of the that has your label / value
    }
}
Ben
fonte
0

você pode fazer assim:

public void selectDropDownValue(String ValueToSelect) 
{

    webelement findDropDownValue=driver.findElements(By.id("id1"))    //this will find that dropdown 

    wait.until(ExpectedConditions.visibilityOf(findDropDownValue));    // wait till that dropdown appear

    super.highlightElement(findDropDownValue);   // highlight that dropdown     

    new Select(findDropDownValue).selectByValue(ValueToSelect);    //select that option which u had passed as argument
}
Praveen
fonte
0

Este método retornará o valor selecionado para o menu suspenso,

public static String getSelected_visibleText(WebDriver driver, String elementType, String value)
  {
    WebElement element = Webelement_Finder.webElement_Finder(driver, elementType, value);
   Select Selector = new Select(element);
    Selector.getFirstSelectedOption();
    String textval=Selector.getFirstSelectedOption().getText();
    return textval;
  }

Entretanto

String textval = Selector.getFirstSelectedOption ();

element.getText ();

Retornará todos os elementos no menu suspenso.

Jophin P John
fonte
-2

Este é o código para selecionar o valor no menu suspenso

O valor para selectlocator será o xpath ou nome da caixa suspensa, e para optionLocator terá o valor a ser selecionado na caixa suspensa.

public static boolean select(final String selectLocator,
        final String optionLocator) {
    try {
        element(selectLocator).clear();
        element(selectLocator).sendKeys(Keys.PAGE_UP);
        for (int k = 0; k <= new Select(element(selectLocator))
                .getOptions().size() - 1; k++) {
            combo1.add(element(selectLocator).getValue());
            element(selectLocator).sendKeys(Keys.ARROW_DOWN);
        }
        if (combo1.contains(optionLocator)) {
            element(selectLocator).clear();
            new Select(element(selectLocator)).selectByValue(optionLocator);
            combocheck = element(selectLocator).getValue();
            combo = "";

            return true;
        } else {
            element(selectLocator).clear();
            combo = "The Value " + optionLocator
                    + " Does Not Exist In The Combobox";
            return false;
        }
    } catch (Exception e) {
        e.printStackTrace();
        errorcontrol.add(e.getMessage());
        return false;
    }
}



private static RenderedWebElement element(final String locator) {
    try {

        return (RenderedWebElement) drivers.findElement(by(locator));
    } catch (Exception e) {
        errorcontrol.add(e.getMessage());
        return (RenderedWebElement) drivers.findElement(by(locator));
    }
}

Obrigado,

Rekha.

Kartmcad
fonte
4
-1 Muito complicada e usando métodos obsoletos (RenderedWebElement)
Ardesco