วิธีการเลือกค่าเมนูแบบหล่นลงด้วย 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องค์ประกอบได้อย่างไร
Prakhar Mohan Srivastava

2
@PrakharMohanSrivastava (และอื่น ๆ ) เพื่อค้นหา XPath หากคุณมีแหล่งข้อมูลที่เน้นในเครื่องมือ Chrome dev คุณสามารถคลิกขวาที่แหล่งที่มาและเลือกคัดลอก -> XPath เพื่อรับ XPath แบบเต็มขององค์ประกอบนั้น
mgrollins

และถ้าฉันไม่มีชื่อของข้อความล่ะ? ฉันแค่ต้องการองค์ประกอบแรกในเมนู
ScottyBlades

คลาส Select ที่เชื่อมโยงอยู่ในคำตอบของ @ alecxe มีฟังก์ชั่นselect_by_indexที่ดูเหมือนว่าเป็นสิ่งที่คุณต้องการ
Alanning

321

ซีลีเนียมให้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 ได้ไหม ในฟังก์ชั่นเลือก?
กิกะไบต์

2
สิ่งนี้ไม่ทำให้เกิดเหตุการณ์ป้อนเข้าสำหรับฉัน :( ฉันต้องทำด้วยตัวเองดังที่กล่าวไว้ที่นี่: stackoverflow.com/questions/2856513/…
Frederick Nord

1
ดีมาก. นี่เป็นการทำความสะอาดแฮ็คที่น่ากลัวที่ฉันใช้
jww

25

ก่อนอื่นคุณต้องนำเข้าคลาส Select แล้วคุณจะต้องสร้างอินสแตนซ์ของ Select class หลังจากสร้างอินสแตนซ์ของคลาสที่เลือกคุณสามารถทำการเลือกวิธีบนอินสแตนซ์นั้นเพื่อเลือกตัวเลือกจากรายการดรอปดาวน์ นี่คือรหัส

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

องค์ประกอบแบบหล่นลงที่มี ID

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? ขอบคุณ
Jiraheta

2
คุณสามารถเขียนรหัสบรรทัดเดียวเช่นนี้ เลือก (driver.find_element_by_id ('id_of_element')) select_by_index (1)
NaramukAbus

7

ฉันลองหลายสิ่งหลายอย่าง แต่แบบเลื่อนลงของฉันอยู่ในตารางและฉันไม่สามารถทำการเลือกแบบง่ายได้ วิธีแก้ปัญหาด้านล่างใช้งานได้เท่านั้น ที่นี่ฉันกำลังไฮไลต์ drop elem และกดลูกศรลงจนได้ค่าที่ต้องการ -

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

งูหลาม:

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 selector เป็นค่าที่สอดคล้องกับผลไม้ที่ต้องการ


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ชั้นยิ่งกว่านั้นคุณต้องมีปฏิสัมพันธ์กับคุณจะต้องทำให้เกิดWebDriverWaitelement_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)

-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 อย่างชัดเจนคำตอบของคุณได้รับการชื่นชมอย่างมาก แต่ไม่จำเป็นในบริบทนี้เนื่องจากเป็นภาษาจาวา

ขออภัยนี่ไม่ใช่ Python ดังที่ได้กล่าวไว้ในคำถามและในแท็ก
Laurent
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.