Як вибрати значення випадаючого меню за допомогою 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


18
FYI, використовуючи Selectклас, полегшує вирішення проблеми, дивіться відповідь, яку я опублікував.
alecxe

1
Що робити, якщо користуюсь find_by_id? Як тоді я надаю значення? Крім того, як я можу знайти xpathелемент?
Прахар Мохан Срівастава

2
@PrakharMohanSrivastava (та інші), щоб знайти XPath, якщо у вас виділено джерело в інструментах для розробників Chrome, ви можете клацнути правою кнопкою миші на джерело та вибрати Copy -> XPath, щоб отримати повний XPath цього елемента.
mgrollins

А що робити, якщо у мене немає назви тексту? Я просто хочу перший елемент у меню.
ScottyBlades

Клас Вибір, зв'язаний у відповіді @ alecxe, забезпечує функцію select_by_index, яка здається, що це те, що ви хочете.
алан

321

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

Дивитися також:


5
Це чудовий шлях, і це повинен бути метод де-факто. Однак зазначу, що вам, можливо, доведеться використовувати більш тупу версію "xpath", якщо автор форми не налаштував належним чином елемент HTML. Якщо просто використовувати поля введення, xpath повинен працювати.
Матвій

1
чи можемо ми знайти елемент xpath замість by_id? у функції Вибір?
GigaByte

2
Це не викликає для мене події введення :( я повинен це зробити сам, як згадувалося тут: stackoverflow.com/questions/2856513/…
Фредерік Норд

1
Дуже хороша. Це очистило деякі жахливі хаки, якими я користувався.
jww

25

спочатку вам потрібно імпортувати клас вибору, а потім вам потрібно створити екземпляр класу Select. Після створення екземпляра класу Select, ви можете виконати вибрані методи для цього примірника, щоб вибрати параметри зі спадного списку. Ось код

from selenium.webdriver.support.select import Select

select_fr = Select(driver.find_element_by_id("fruits01"))
select_fr.select_by_index(0)

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

Вибір "Banana" зі спадного меню

  1. Використання індексу випадаючого

ddelement.select_by_index(1)

  1. Використовуючи значення випадаючого

ddelement.select_by_value('1')

  1. Ви можете скористатись текстом, який відображається у спадному меню.

ddelement.select_by_visible_text('Banana')


Чи є спосіб перетворити його в єдиний рядок коду? а не робити змінну, щоб потім застосувати 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

Не потрібно нічого клацати. Скористайтеся функцією find by 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>

Пітон:

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

Це воно.


3

Ви можете використовувати комбінацію css selector well

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

Змініть 1 у селекторі атрибута = значення css на значення, відповідне бажаному плоду.


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

Це буде добре працювати


2

Він працює зі значенням опціону:

from selenium import webdriver
b = webdriver.Firefox()
b.find_element_by_xpath("//select[@class='class_name']/option[@value='option_value']").click()

2

Таким чином ви можете вибрати всі параметри в будь-якому спадному меню.

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

Найкращий спосіб використання 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

Відповідно до наданого 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>текст із текстом як манго із пунктуВи можете використовувати, Ви можете використовувати одну з наступних стратегій локатора :

  • Використання атрибута і методу IDselect_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)

-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, як згадується у запитанні та в тегах
Лоран
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.