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

185

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

Например:

<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) Сначала я должен нажать на него. Я сделаю это:

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

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

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

Адам Бовьен
источник

Ответы:

113

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

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

Вот пример:

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

Вы можете прочитать больше в:
/sqa/1355/unable-to-select-an-option-using-seleniums-python-webdriver

alanning
источник
18
К вашему сведению, использование Selectклассов значительно облегчает решение проблемы, см. Ответ, который я опубликовал.
Алексей
1
Что мне делать, если я использую find_by_id? Как мне поставить значение тогда? Кроме того, как мне найти xpathэлемент?
Прахар Мохан Шривастава
2
@PrakharMohanSrivastava (и другие), чтобы найти XPath, если у вас выделен источник в инструментах разработчика Chrome, вы можете щелкнуть правой кнопкой мыши по источнику и выбрать «Копировать -> XPath», чтобы получить полный XPath этого элемента.
mgrollins
А что если у меня нет названия текста? Я просто хочу первый элемент в меню.
ScottyBlades
Класс Select, связанный в ответе @ alecxe, предоставляет функцию select_by_index, которая выглядит так, как будто вы хотите этого.
alanning
322

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')

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

alecxe
источник
5
Это отличный способ, и он должен быть де-факто. Однако я отмечу, что вам, возможно, придется использовать более тупую версию «xpath», если автор формы неправильно настроил выбранный элемент HTML. Если просто использовать поля ввода, xpath должен работать.
Мэтью
1
мы можем найти элемент по xpath вместо by_id? в функции выбора?
GigaByte
2
Это не вызывает событие ввода для меня :( Я должен сделать это сам, как упомянуто здесь: stackoverflow.com/questions/2856513/…
Фредерик Норд,
1
Очень хорошо. Это убрало некоторые ужасные хаки, которые я использовал.
jww
25

сначала вам нужно импортировать класс 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)
Vaibhav
источник
14

Я надеюсь, что этот код поможет вам.

from selenium.webdriver.support.ui import Select

выпадающий элемент с идентификатором

ddelement= Select(driver.find_element_by_id('id_of_element'))

выпадающий элемент с xpath

ddelement= Select(driver.find_element_by_xpath('xpath_of_element'))

выпадающий элемент с селектором CSS

ddelement= Select(driver.find_element_by_css_selector('css_selector_of_element'))

Выбор «Банан» из выпадающего

  1. Использование индекса выпадающего

ddelement.select_by_index(1)

  1. Используя значение выпадающего

ddelement.select_by_value('1')

  1. Вы можете использовать соответствующий текст, который отображается в раскрывающемся списке.

ddelement.select_by_visible_text('Banana')

NaramukAbus
источник
Есть ли способ сделать это в одной строке кода? вместо создания переменной, чтобы затем применить Select? Спасибо
Джирахета
2
Вы можете написать однострочный код, как это. Выбрать (driver.find_element_by_id ('id_of_element')). Select_by_index (1)
NaramukAbus
7

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

        #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)
Абхинав Бхатнагар
источник
6

Вам не нужно ничего нажимать. Используйте поиск по 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")

Вот и все.

Шейн Чик
источник
3

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

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

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

QHarr
источник
1
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)

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

Kuladip
источник
1

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

from selenium import webdriver
b = webdriver.Firefox()
b.find_element_by_xpath("//select[@class='class_name']/option[@value='option_value']").click()
Jackssn
источник
1

Таким образом, вы можете выбрать все варианты в любом раскрывающемся списке.

driver.get("https://www.spectrapremium.com/en/aftermarket/north-america")

print( "The title is  : " + driver.title)

inputs = Select(driver.find_element_by_css_selector('#year'))

input1 = len(inputs.options)

for items in range(input1):

    inputs.select_by_index(items)
    time.sleep(1)
Раза ул Мустафа
источник
Я пытаюсь выбрать один за другим for items in range(1,input1): inputs.select_by_index(items), но это начинается со второго индекса. Как я могу получить первое значение?
RxT
1

Согласно предоставленному 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>

Чтобы выбрать <option>элемент изВ меню вы должны использовать Select Class . Более того, так как вы должны взаимодействовать сВы должны вызвать WebDriverWait для element_to_be_clickable().

Чтобы выбрать <option>текст с манго извы можете использовать вы можете использовать любую из следующих стратегий локатора :

  • Используя ID атрибут и select_by_visible_text()метод:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import Select
    
    select = Select(WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "fruits01"))))
    select.select_by_visible_text("Mango")
  • Используя CSS-SELECTOR и select_by_value()метод:

    select = Select(WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "select.select[name='fruits']"))))
    select.select_by_value("2")
  • Используя XPATH и select_by_index()метод:

    select = Select(WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "//select[@class='select' and @name='fruits']"))))
    select.select_by_index(2)
DebanjanB
источник
0

Лучший способ использовать 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);
Саураб Гаур
источник
-2
  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();

}

}

амитабх синха
источник
2
Вопрос явно требует решения на Python, ваш ответ высоко ценится, но не требуется в этом контексте, так как написан на Java.
Извините, но это не Python, как указано в вопросе и в тегах
Лоран