Как выбрать значение опции выпадающего меню с помощью Selenium (Python) - PullRequest
123 голосов
/ 23 октября 2011

Мне нужно выбрать элемент из выпадающего меню .

Например:

<select id="fruits01" class="select" name="fruits">
  <option value="0">Choose your fruits:</option>
  <option value="1">Banana</option>
  <option value="2">Mango</option>
</select>

1) Первый Iдолжны нажать на него.Я делаю это:

inputElementFruits = driver.find_element_by_xpath("//select[id='fruits']").click()

2) После этого мне нужно выбрать хороший элемент, скажем Mango.

Я пытался сделать это с inputElementFruits.send_keys(...) но это не сработало.

Ответы [ 10 ]

225 голосов
/ 19 февраля 2015

Selenium предоставляет удобный Select класс для работы с select -> option конструкциями:

from selenium import webdriver
from selenium.webdriver.support.ui import Select

driver = webdriver.Firefox()
driver.get('url')

select = Select(driver.find_element_by_id('fruits01'))

# select by visible text
select.select_by_visible_text('Banana')

# select by value 
select.select_by_value('1')

Смотри также:

87 голосов
/ 02 ноября 2011

Если ваш щелчок не запускает какой-то ajax-вызов для заполнения вашего списка, вам фактически не нужно выполнять щелчок.

Просто найдите элемент, а затем перечислите опции, выбирая нужные опции.

Вот пример:

from selenium import webdriver
b = webdriver.Firefox()
b.find_element_by_xpath("//select[@name='element_name']/option[text()='option_text']").click()

Подробнее читайте в:
https://sqa.stackexchange.com/questions/1355/unable-to-select-an-option-using-seleniums-python-webdriver

19 голосов
/ 23 ноября 2017

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

from selenium.webdriver.support.select import Select

select_fr = Select(driver.find_element_by_id("fruits01"))
select_fr.select_by_index(0)
6 голосов
/ 24 ноября 2016

Я перепробовал много вещей, но мой выпадающий список находился внутри таблицы, и я не смог выполнить простую операцию выбора. Работало только приведенное ниже решение. Здесь я выделяю выпадающий элемент и нажимаю стрелку вниз до получения желаемого значения -

        #identify the drop down element
        elem = browser.find_element_by_name(objectVal)
        for option in elem.find_elements_by_tag_name('option'):
            if option.text == value:
                break

            else:
                ARROW_DOWN = u'\ue015'
                elem.send_keys(ARROW_DOWN)
3 голосов
/ 19 марта 2019

Вы можете использовать комбинацию селектора CSS для скважины

driver.find_element_by_css_selector("#fruits01 [value='1']").click()

Измените 1 в селекторе атрибута = значение css на значение, соответствующее желаемому фрукту.

2 голосов
/ 20 ноября 2018

Вам не нужно ничего нажимать.Используйте поиск по xpath или как хотите, а затем используйте ключи отправки

Например: HTML:

<select id="fruits01" class="select" name="fruits">
    <option value="0">Choose your fruits:</option>
    <option value="1">Banana</option>
    <option value="2">Mango</option>
</select>

Python:

fruit_field = browser.find_element_by_xpath("//input[@name='fruits']")
fruit_field.send_keys("Mango")

Вот и все.

2 голосов
/ 12 апреля 2017
from selenium.webdriver.support.ui import Select
driver = webdriver.Ie(".\\IEDriverServer.exe")
driver.get("https://test.com")
select = Select(driver.find_element_by_xpath("""//input[@name='n_name']"""))
select.select_by_index(2)

Будет нормально работать

1 голос
/ 16 июня 2019

Работает со значением параметра:

from selenium import webdriver
b = webdriver.Firefox()
b.find_element_by_xpath("//select[@class='class_name']/option[@value='option_value']").click()
1 голос
/ 28 августа 2016

Лучший способ использовать класс selenium.webdriver.support.ui.Select для работы с выпадающим списком, но иногда он не работает должным образом из-за проблем проектирования или других проблем HTML.

В такой ситуации выМожно также выбрать альтернативное решение, используя execute_script(), как показано ниже: -

option_visible_text = "Banana"
select = driver.find_element_by_id("fruits01")

#now use this to select option from dropdown by visible text 
driver.execute_script("var select = arguments[0]; for(var i = 0; i < select.options.length; i++){ if(select.options[i].text == arguments[1]){ select.options[i].selected = true; } }", select, option_visible_text);
0 голосов
/ 11 января 2019
  1. Элемент списка

открытый класс ListBoxMultiple {

public static void main(String[] args) throws InterruptedException {
    // TODO Auto-generated method stub
    System.setProperty("webdriver.chrome.driver", "./drivers/chromedriver.exe");
    WebDriver driver=new ChromeDriver();
    driver.get("file:///C:/Users/Amitabh/Desktop/hotel2.html");//open the website
    driver.manage().window().maximize();


    WebElement hotel = driver.findElement(By.id("maarya"));//get the element

    Select sel=new Select(hotel);//for handling list box
    //isMultiple
    if(sel.isMultiple()){
        System.out.println("it is multi select list");
    }
    else{
        System.out.println("it is single select list");
    }
    //select option
    sel.selectByIndex(1);// you can select by index values
    sel.selectByValue("p");//you can select by value
    sel.selectByVisibleText("Fish");// you can also select by visible text of the options
    //deselect option but this is possible only in case of multiple lists
    Thread.sleep(1000);
    sel.deselectByIndex(1);
    sel.deselectAll();

    //getOptions
    List<WebElement> options = sel.getOptions();

    int count=options.size();
    System.out.println("Total options: "+count);

    for(WebElement opt:options){ // getting text of every elements
        String text=opt.getText();
        System.out.println(text);
        }

    //select all options
    for(int i=0;i<count;i++){
        sel.selectByIndex(i);
        Thread.sleep(1000);
    }

    driver.quit();

}

}

...