Bagaimana cara memilih nilai menu drop-down dengan Selenium menggunakan Python?

184

Saya perlu memilih elemen dari menu drop-down .

Sebagai contoh:

<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) Pertama saya harus mengkliknya. Saya melakukan ini:

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

2) Setelah itu saya harus memilih elemen yang baik, katakan saja Mango.

Saya mencoba melakukannya dengan inputElementFruits.send_keys(...)tetapi tidak berhasil.

Adam Bovien
sumber

Jawaban:

112

Kecuali jika klik Anda mengaktifkan semacam panggilan ajax untuk mengisi daftar Anda, Anda sebenarnya tidak perlu menjalankan klik.

Cukup temukan elemen dan kemudian sebutkan opsi, pilih opsi yang Anda inginkan.

Berikut ini sebuah contoh:

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

Anda dapat membaca lebih lanjut di:
/sqa/1355/unable-to-select-an-option-using-seleniums-python-webdriver

alanning
sumber
18
FYI, menggunakan Selectkelas membuat masalah lebih mudah untuk dipecahkan, lihat jawaban yang saya posting.
alecxe
1
Apa yang harus saya lakukan jika saya menggunakan find_by_id? Bagaimana cara saya memberikan nilai? Juga, bagaimana cara menemukan xpathelemen?
Prakhar Mohan Srivastava
2
@PrakharMohanSrivastava (dan lainnya) untuk menemukan XPath, jika Anda memiliki sumber yang disorot di alat Chrome dev, Anda dapat mengklik kanan pada sumbernya, dan memilih Salin -> XPath untuk mendapatkan XPath penuh dari elemen itu.
mgrollin
Dan bagaimana jika saya tidak memiliki nama teksnya? Saya hanya ingin elemen pertama dalam menu.
ScottyBlades
Pilih kelas yang ditautkan dalam jawaban @ alecxe menyediakan fungsi select_by_index yang sepertinya adalah yang Anda inginkan.
alanning
321

Selenium menyediakan Selectkelas yang nyaman untuk bekerja dengan select -> optionkonstruksi:

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

Lihat juga:

alecxe
sumber
5
Ini adalah cara terbaik untuk digunakan, dan harus menjadi metode de facto. Namun, saya akan mencatat bahwa Anda mungkin harus menggunakan versi "xpath" yang lebih tumpul jika pembuat formulir belum benar mengatur elemen HTML pilihan. Jika hanya menggunakan kolom input, xpath harus berfungsi.
Matius
1
bisakah kita menemukan elemen dengan xpath bukan by_id? dalam fungsi Pilih?
GigaByte
2
Ini tidak memicu input event untuk saya :( Saya harus melakukannya sendiri seperti yang disebutkan di sini: stackoverflow.com/questions/2856513/…
Frederick Nord
1
Sangat bagus. Ini membersihkan beberapa peretasan mengerikan yang saya gunakan.
jww
25

pertama Anda perlu mengimpor kelas Select dan kemudian Anda perlu membuat instance dari kelas Select. Setelah membuat instance dari kelas Select, Anda dapat melakukan metode pilih pada instance itu untuk memilih opsi dari daftar dropdown. Ini kodenya

from selenium.webdriver.support.select import Select

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

Saya harap kode ini akan membantu Anda.

from selenium.webdriver.support.ui import Select

elemen tarik-turun dengan id

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

elemen dropdown dengan xpath

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

elemen tarik-turun dengan pemilih css

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

Memilih 'Pisang' dari dropdown

  1. Menggunakan indeks dropdown

ddelement.select_by_index(1)

  1. Menggunakan nilai dropdown

ddelement.select_by_value('1')

  1. Anda dapat menggunakan teks yang cocok yang ditampilkan di drop down.

ddelement.select_by_visible_text('Banana')

NaramukAbus
sumber
Apakah ada cara untuk membuatnya menjadi satu baris kode? daripada membuat variabel untuk kemudian menerapkan Pilih? Terima kasih
Jiraheta
2
Anda dapat menulis kode baris tunggal seperti ini. Pilih (driver.find_element_by_id ('id_of_element')). Select_by_index (1)
NaramukAbus
7

Saya mencoba banyak hal, tetapi drop down saya ada di dalam meja dan saya tidak dapat melakukan operasi pilih yang sederhana. Hanya solusi di bawah ini yang berfungsi. Di sini saya menyoroti elem drop-down dan menekan panah ke bawah sampai mendapatkan nilai yang diinginkan -

        #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)
Abhinav Bhatnagar
sumber
6

Anda tidak perlu mengklik apa pun. Gunakan find by xpath atau apa pun yang Anda pilih dan kemudian gunakan tombol kirim

Sebagai contoh Anda: 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")

Itu dia.

Pipi Shane
sumber
3

Anda dapat menggunakan kombinasi pemilih css dengan baik

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

Ubah 1 pada atribut = value css selector ke nilai yang sesuai dengan buah yang diinginkan.

QHarr
sumber
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)

Ini akan bekerja dengan baik

Kuladip
sumber
2

Ini bekerja dengan nilai opsi:

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

Dengan cara ini Anda dapat memilih semua opsi dalam dropdown apa pun.

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)
Raza ul Mustafa
sumber
Saya mencoba memilih satu per satu menggunakan for items in range(1,input1): inputs.select_by_index(items), tetapi dimulai dari indeks kedua. Bagaimana saya bisa mendapatkan nilai pertama?
RxT
1

Cara terbaik untuk menggunakan selenium.webdriver.support.ui.Selectkelas untuk bekerja dengan pilihan dropdown tetapi beberapa waktu itu tidak berfungsi seperti yang diharapkan karena masalah desain atau masalah lain dari HTML.

Dalam situasi seperti ini Anda juga dapat memilih solusi alternatif menggunakan execute_script()seperti di bawah ini: -

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);
Saurabh Gaur
sumber
0

Sesuai HTML yang disediakan:

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

Untuk memilih <option>elemen dari amenu Anda harus menggunakan Pilih Kelas . Apalagi, karena Anda harus berinteraksi denganAnda harus menginduksi WebDriverWait untuk element_to_be_clickable().

Untuk memilih <option>teks dengan sebagai Mangga dari menuAnda dapat menggunakan Anda dapat menggunakan salah satu dari Strategi Pencari Lokasi berikut :

  • Menggunakan atribut dan metode 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")
  • Menggunakan CSS-SELECTOR dan select_by_value()metode:

    select = Select(WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "select.select[name='fruits']"))))
    select.select_by_value("2")
  • Menggunakan XPATH dan select_by_index()metode:

    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
sumber
-2
  1. Daftar barang

ListBoxMultiple kelas publik {

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();

}

}

amitabh sinha
sumber
2
Pertanyaannya jelas meminta solusi Python, jawaban Anda sangat dihargai, tetapi tidak diperlukan dalam konteks ini karena itu ditulis di Jawa.
Maaf tapi ini bukan Python seperti yang disebutkan dalam pertanyaan dan tag
Laurent