无法使用 Python、Selenium 从下拉列表中选择 select 选项

Unable to select an option from a dropdown using Python, Selenium

我正在尝试使用以下代码来使用 selenium (python) select 网页下拉列表中的一个选项。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.ui import Select

import time
import os
import wget

driver = webdriver.Chrome('chromedriver')
driver.get('https://www.hkbea.com/jsp/hk/bea-mpf-fund-information2.jsp?language=en')

#select scheme dropdown menu
scheme_name = Select(driver.find_element_by_id("mpfGroup"))
scheme_name.select_by_visible_text('BEA (MPF) Master Trust Scheme')

#select fund dropdown menu
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-id="mpfFunds"]'))).click()
funds = Select(WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.ID, 'mpfFunds')))).options
funds.select_by_value("AGF")
#funds.select_by_visible_text("BEA (MPF) Asian Equity Fund")

select方案下拉菜单(第一个)没问题,但是当我尝试select资金下拉菜单(第二个)时出现问题。

# without select
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-id="mpfFunds"]'))).click()
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'ul[data-original-index="0"]'))).click()

我尝试使用另一种方式而不使用 select class,它仅适用于 'ul[data-original-index="0"]' 元素,但不适用于 'ul[data-original-index="1"]'..[= 等其他元素17=]

对于如何始终如一地 select 从提供的代码中注明的下拉列表中选择一个选项,我将不胜感激。这是我查看的网站:https://www.hkbea.com/jsp/hk/bea-mpf-fund-information2.jsp?language=en

看到下拉列表不是由 Select 和选项组成的,所以你不能使用 Selenium 中的 Select,它们是由 li 和 span 组成的,试试下面的代码:

driver = webdriver.Chrome(driver_path)
driver.maximize_window()
driver.implicitly_wait(30)
driver.get("https://www.hkbea.com/jsp/hk/bea-mpf-fund-information2.jsp?language=en")
wait = WebDriverWait(driver, 20)
#click on accept cookie button
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.accept-span"))).click()

#Scheme name drop down
wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Please select scheme']/.."))).click()
wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='BEA (MPF) Master Trust Scheme']/.."))).click()

#Constituent Funds: drop down

wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Please select constituent fund']/.."))).click()
wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='BEA (MPF) Asian Equity Fund']/.."))).click()

进口:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

更新 1:

你一次不能select超过3个选项,那是你的申请问题。然而,下面的代码应该点击所有选项但只会 select 3,因为应用程序不允许。

#Constituent Funds: drop down
wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Please select constituent fund']/.."))).click()
total_number_of_options = len(driver.find_elements(By.XPATH, "//li[@data-original-index]/a[@class='opt MT ']"))
i = 1
while total_number_of_options > 0 :
    try:
        ele = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, f"(//li[@data-original-index]/a[@class='opt MT '])[{i}]")))
        ActionChains(driver).move_to_element(ele).click().perform()
        time.sleep(1)
        i = i + 1
    except:
        print('click did not work')
        break