Làm cách nào để chọn giá trị menu thả xuống với Selenium bằng Python?


184

Tôi cần chọn một yếu tố từ menu thả xuống .

Ví dụ:

<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) Đầu tiên tôi phải bấm vào nó. Tôi làm việc này:

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

2) Sau đó tôi phải chọn yếu tố tốt, giả sử Mango.

Tôi đã cố gắng để làm điều đó với inputElementFruits.send_keys(...)nhưng nó không hoạt động.

Câu trả lời:


112

Trừ khi nhấp chuột của bạn đang thực hiện một số loại cuộc gọi ajax để điền vào danh sách của bạn, bạn thực sự không cần phải thực hiện nhấp chuột.

Chỉ cần tìm phần tử và sau đó liệt kê các tùy chọn, chọn (các) tùy chọn bạn muốn.

Đây là một ví dụ:

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

Bạn có thể đọc thêm trong:
/sqa/1355/unable-to-select-an-option-USE-seleniums-python-webdo


18
FYI, sử dụng Selectlớp làm cho vấn đề dễ giải quyết hơn nhiều, hãy xem câu trả lời tôi đã đăng.
alecxe

1
Tôi phải làm gì nếu tôi đang sử dụng find_by_id? Làm thế nào để tôi cung cấp giá trị sau đó? Ngoài ra, làm thế nào để tôi tìm thấy xpathmột yếu tố?
Prakhar Mohan Srivastava

2
@PrakharMohanSrivastava (và những người khác) để tìm XPath, nếu bạn có nguồn được tô sáng trong các công cụ dev của Chrome, bạn có thể nhấp chuột phải vào nguồn và chọn Sao chép -> XPath để có XPath đầy đủ của phần tử đó.
mgrollin

Và nếu tôi không có tên của văn bản thì sao? Tôi chỉ muốn yếu tố đầu tiên trong menu.
ScottyBlades

Lớp Chọn được liên kết trong câu trả lời của @ alecxe cung cấp hàm select_by_index có vẻ như đó là những gì bạn muốn.
alanning

321

Selenium cung cấp một Selectlớp thuận tiện để làm việc với các select -> optioncấu trúc:

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

Xem thêm:


5
Đây là một cách tuyệt vời để đi, và nên là phương pháp thực tế. Tuy nhiên, tôi sẽ lưu ý rằng bạn có thể phải sử dụng phiên bản "xpath" khó hiểu hơn nếu tác giả của biểu mẫu không thiết lập đúng một yếu tố HTML được chọn. Nếu chỉ đơn giản là sử dụng các trường đầu vào, xpath sẽ hoạt động.
Matthew

1
chúng ta có thể tìm phần tử bằng xpath thay vì by_id không? trong chức năng Chọn?
GigaByte

2
Điều này không kích hoạt một sự kiện đầu vào cho tôi :( Tôi phải tự làm điều đó như được đề cập ở đây: stackoverflow.com/questions/2856513/ mẹo
Frederick Nord

1
Rất đẹp. Điều này làm sạch một số hack khủng khiếp tôi đang sử dụng.
jww

25

trước tiên bạn cần nhập lớp Chọn và sau đó bạn cần tạo thể hiện của lớp Chọn. Sau khi tạo thể hiện của lớp Chọn, bạn có thể thực hiện các phương thức chọn trong thể hiện đó để chọn các tùy chọn từ danh sách thả xuống. Đây là mã

from selenium.webdriver.support.select import Select

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

13

Tôi hy vọng mã này sẽ giúp bạn.

from selenium.webdriver.support.ui import Select

yếu tố thả xuống với id

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

phần tử thả xuống với xpath

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

phần tử thả xuống với bộ chọn css

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

Chọn 'Banana' từ danh sách thả xuống

  1. Sử dụng chỉ số thả xuống

ddelement.select_by_index(1)

  1. Sử dụng giá trị thả xuống

ddelement.select_by_value('1')

  1. Bạn có thể sử dụng khớp văn bản được hiển thị trong trình đơn thả xuống.

ddelement.select_by_visible_text('Banana')


Có cách nào để biến nó thành một dòng mã không? thay vì tạo một biến để sau đó áp dụng Chọn? Cảm ơn
Jiraheta

2
bạn có thể viết một mã dòng đơn như thế này. Chọn (driver.find_element_by_id ('id_of_element')). Select_by_index (1)
NaramukAbus

7

Tôi đã thử rất nhiều thứ, nhưng thả xuống của tôi ở trong một cái bàn và tôi không thể thực hiện một thao tác chọn đơn giản. Chỉ có giải pháp dưới đây làm việc. Ở đây tôi làm nổi bật thả xuống elem và nhấn mũi tên xuống cho đến khi nhận được giá trị mong muốn -

        #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

Bạn không cần phải nhấp vào bất cứ điều gì. Sử dụng find by xpath hoặc bất cứ thứ gì bạn chọn và sau đó sử dụng phím gửi

Ví dụ của bạn: 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>

Con trăn

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

Đó là nó.


3

Bạn có thể sử dụng kết hợp bộ chọn css một giếng

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

Thay đổi 1 trong bộ chọn css thuộc tính = value thành giá trị tương ứng với trái cây mong muốn.


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)

Nó sẽ hoạt động tốt


2

Nó hoạt động với giá trị tùy chọn:

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

2

Bằng cách này, bạn có thể chọn tất cả các tùy chọn trong bất kỳ danh sách thả xuống nào.

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)

Tôi đang cố gắng chọn từng cái một bằng cách sử dụng for items in range(1,input1): inputs.select_by_index(items), nhưng nó bắt đầu từ chỉ mục thứ hai. Làm thế nào tôi có thể nhận được giá trị đầu tiên?
RxT

1

Cách tốt nhất để sử dụng selenium.webdriver.support.ui.Selectlớp để làm việc với lựa chọn thả xuống nhưng đôi khi nó không hoạt động như mong đợi do vấn đề thiết kế hoặc các vấn đề khác của HTML.

Trong loại tình huống này, bạn cũng có thể thích giải pháp thay thế bằng cách sử dụng execute_script()như sau: -

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

Theo HTML được cung cấp:

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

Để chọn một <option> yếu tố từ mộtmenu bạn phải sử dụng Chọn lớp . Hơn nữa, khi bạn phải tương tác vớibạn phải tạo ra WebDriverWait cho element_to_be_clickable().

Để chọn <option>văn bản có tên là Mango từbạn có thể sử dụng bạn có thể sử dụng một trong các Chiến lược định vị sau:

  • Sử dụng thuộc tính và phương thức 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")
  • Sử dụng CSS-SELECTORselect_by_value()phương thức:

    select = Select(WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "select.select[name='fruits']"))))
    select.select_by_value("2")
  • Sử dụng XPATHselect_by_index()phương thức:

    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. Danh sách mục

lớp công khai ListBoxMult Môn {

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
Câu hỏi rõ ràng yêu cầu một giải pháp Python, câu trả lời của bạn được đánh giá cao, nhưng không bắt buộc trong ngữ cảnh này vì nó được viết bằng Java.

Xin lỗi nhưng đây không phải là Python như được đề cập trong câu hỏi và trong các thẻ
Laurent
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.