2011-10-23 38 views
68

Tôi cần phải chọn một phần tử từ trình đơn thả xuống.Selenium - Python - giá trị tùy chọn menu thả xuống

Ví dụ, mở này:

<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. Vì vậy, đầu tiên tôi phải click vào nó. Tôi làm điều này:

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

(ok, nó mở menu)

  1. Và sau khi tôi phải chọn phần tử tốt, cho phép nói Mango. Tôi thử điều khác với inputElementFruits.send_keys(...) nhưng nó không hoạt động.

Trả lời

49

Trừ khi nhấp chuột của bạn đang kích hoạt một số loại cuộc gọi ajax để điền danh sách của bạn, bạn không thực sự cần 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.

Dưới đâ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 tại:
https://sqa.stackexchange.com/questions/1355/unable-to-select-an-option-using-seleniums-python-webdriver

+7

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

+0

Tôi phải làm gì nếu tôi đang sử dụng 'find_by_id'? Làm cách nào để cung cấp giá trị sau đó? Ngoài ra, làm thế nào để tôi tìm thấy 'xpath' của một phần tử? –

118

Selenium cung cấp một tiện lợi Select class để làm việc với select -> option cấ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:

+0

Đây là một cách tuyệt vời để đi và phải 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" phức tạp hơn nếu tác giả của biểu mẫu chưa thiết lập đúng phần tử HTML được chọn. Nếu chỉ đơn giản là sử dụng các trường nhập, thì xpath sẽ hoạt động. – Matthew

0

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

Trong loại tình huống mà bạn cũng có thể thích như giải pháp thay thế 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); 
2

tôi đã cố gắng rất nhiều nhiều thứ, nhưng danh sách thả xuống của tôi là bên trong một bảng và tôi đã không thể thực hiện thao tác chọn đơn giản. Chỉ có giải pháp dưới đây hoạt động. Ở đây tôi đang 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) 
0
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ẽ làm việc tốt

2

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

from selenium.webdriver.support.select import Select 

select_fr = Select(driver.find_element_by_id("fruits01") 
select_fr.select_by_index(0) 
Các vấn đề liên quan