hhrzc
hhrzc

Reputation: 2051

Selenium Select not working on <select> element

I have the task to click on element in the droplist, using exactly Select class.

So I have the HTML block:

<div id="_desktop_currency_selector">
  <div class="currency-selector dropdown js-dropdown open">
    <span>Валюта:</span>
    <span class="expand-more _gray-darker hidden-sm-down" data-toggle="dropdown">UAH ₴</span>
    <a data-target="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true" class="hidden-sm-down">
      <i class="material-icons expand-more"></i>
    </a>
    <ul class="dropdown-menu hidden-sm-down" aria-labelledby="dLabel" style="display: block;">
        <li>
          <a title="Евро" rel="nofollow" href="http://prestashop-automation.qatestlab.com.ua/ru/?SubmitCurrency=1&amp;id_currency=2" class="dropdown-item">EUR €</a>
        </li>
        <li class="current">
          <a title="Украинская гривна" rel="nofollow" href="http://prestashop-automation.qatestlab.com.ua/ru/?SubmitCurrency=1&amp;id_currency=1" class="dropdown-item">UAH ₴</a>
        </li>
        <li>
          <a title="Доллар США" rel="nofollow" href="http://prestashop-automation.qatestlab.com.ua/ru/?SubmitCurrency=1&amp;id_currency=3" class="dropdown-item">USD $</a>
        </li>
    </ul>
    <select class="link hidden-md-up">
              <option value="http://prestashop-automation.qatestlab.com.ua/ru/?SubmitCurrency=1&amp;id_currency=2">EUR €</option>
              <option value="http://prestashop-automation.qatestlab.com.ua/ru/?SubmitCurrency=1&amp;id_currency=1" selected="selected">UAH ₴</option>
              <option value="http://prestashop-automation.qatestlab.com.ua/ru/?SubmitCurrency=1&amp;id_currency=3">USD $</option>
    </select>
  </div>
</div>

In follow attempt, I have

org.openqa.selenium.TimeoutException: Expected condition failed: waiting for element to be clickable: By.xpath: //*[@id='_desktop_currency_selector']//select (tried for 30 second(s) with 500 MILLISECONDS interval)

    click(currencyDropListBtn);

    WebElement dropListBtn = driver.findElement(By.xpath("//*[@id='_desktop_currency_selector']//i"));
    waitToBeClickable(dropListBtn);
    dropListBtn.click();

    WebElement dropListElement = driver.findElement(By.xpath("//*[@id='_desktop_currency_selector']//select"));

    waitToBeClickable(dropListElement);
    Select select = new Select(dropListElement);
    select.selectByIndex(1);

It will be work in the follow way:

    WebElement dropListBtn = driver.findElement(By.xpath("//*[@id='_desktop_currency_selector']//i"));
    waitToBeClickable(dropListBtn);
    dropListBtn.click();

    WebElement dropListElement = driver.findElement(By.xpath("//a[@title='Евро']"));
    waitToBeClickable(dropListElement);
    click(dropListElement);

But I need to use exactly Select class.

How to correctly select the droplist element via Select?

Upvotes: 0

Views: 271

Answers (1)

JM217
JM217

Reputation: 737

Normally for select element, you do not need to click the option inside it. You can just set the value of the select element with value of the option you want to select.


I post a utility function that I use a lot.

    set_value("//select[@class='link hidden-md-up']",'http://prestashop-automation.qatestlab.com.ua/ru/?SubmitCurrency=1&amp;id_currency=3','value')

    def set_value(xpath, val, field):
        script = """(function() 
                        {
                            node = document.evaluate("%s", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
                            if (node==null) 
                                return '';
                            node.%s='%s'; 
                            return 'ok';
                })()"""%(xpath,field,val)
        driver.execute_script(script)

Upvotes: 1

Related Questions