使用Python Selenium操作网页时无法选中第二个下拉框选项如何解决
问题原因
- 你操作的第二个基金下拉框使用了Bootstrap Select前端组件,原生
<select>标签被设置为不可见,Selenium的Select类仅支持操作原生可见的select元素,所以直接调用会失效。 - 你之前的写法定位错了元素:
data-original-index属性是挂载在每个选项对应的<li>标签上,不是外层<ul>标签,所以只能选中第一个索引对应的ul下的第一个元素,其他索引无法匹配。 - 第一个下拉框选中后第二个下拉框的选项是联动异步加载的,没有等待加载完成就操作也会导致选中失败。
稳定实现方案
直接操作Bootstrap 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') wait = WebDriverWait(driver, 10) # 选择第一个计划下拉框 scheme_name = Select(driver.find_element(By.ID, "mpfGroup")) scheme_name.select_by_visible_text('BEA (MPF) Master Trust Scheme') # 等待第二个下拉框联动加载完成 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'select#mpfFunds option[value="AGF"]'))) # 点击展开基金下拉框 wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-id="mpfFunds"]'))).click() # 方式1:按value值选中对应选项 target_option = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'ul.dropdown-menu.inner li a[rel="AGF"]'))) target_option.click() # 方式2:按可见文本选中对应选项,替换掉上面方式1的代码即可 # target_text = "BEA (MPF) Asian Equity Fund" # target_option = wait.until(EC.element_to_be_clickable((By.XPATH, f'//ul[@class="dropdown-menu inner"]/li/a/span[text()="{target_text}"]'))) # target_option.click()
代码说明
- 新增了等待原生select下option加载完成的逻辑,保证两个下拉框的联动执行完毕,避免选空
- Bootstrap Select生成的每个选项的
<a>标签的rel属性和原生select的option的value属性一一对应,直接定位该元素点击即可实现和select_by_value相同的效果 - 按文本选择的适配方案可以满足需要根据显示内容选择的场景,稳定性和按value选择一致
内容的提问来源于stack exchange,提问作者teri ciu
相关产品推荐
相关产品推荐

