You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用Python Selenium定位并选择下拉列表首个元素

问题描述

晚上好,我来自奥地利!我尝试用Python的Selenium获取下拉列表元素但失败了,存储下拉列表的元素如下:

<input aria-invalid="false" autocomplete="off" type="text" class="MuiInputBase-input MuiOutlinedInput-input MuiAutocomplete-input MuiAutocomplete-inputFocused MuiInputBase-inputAdornedEnd MuiOutlinedInput-inputAdornedEnd" aria-autocomplete="list" autocapitalize="none" spellcheck="false" value="" id="mui-76755">

点击下拉按钮后,会出现带有aria_controls = "mui-76755"的元素,下拉列表首个元素ID为"mui-76755-option-0",但我找不到用Python Selenium选择这个首个元素的方法。

补充操作步骤:访问https://directory.brcgs.com/ → 点击Country → 从下拉列表选择国家。

现有代码:

url = 'https://directory.brcgs.com/'
driver = webdriver.Chrome(executable_path=ChromeDriverManager().install())
driver.get(url)
driver.maximize_window()
time.sleep(5)
#driver.find_element(By.XPATH,'/html/body/div[3]/div[1]/div/div[2]/div[2]/div[1]/div[2]').click()
time.sleep(5)
driver.find_element(By.CSS_SELECTOR, "#root > div.page-container > div > div.PublicDirectory_publicDirectory__3yPKO > div.PublicDirectory_main__109y3 > div.FilterGroup_FilterGroup__1tA0A.PublicDirectory_filters__Rg1EU > div:nth-child(2)").click()
time.sleep(15)

input_element = driver.find_element(By.CSS_SELECTOR, "#root > div.page-container > div > div.PublicDirectory_publicDirectory__3yPKO > div.PublicDirectory_main__109y3 > div.FilterGroup_FilterGroup__1tA0A.PublicDirectory_filters__Rg1EU > div.MuiPaper-root.MuiAccordion-root.filter-row.Mui-expanded.MuiAccordion-rounded.MuiPaper-elevation1.MuiPaper-rounded > div.MuiCollapse-container.MuiCollapse-entered > div > div > div > div > div > div > div > div")
input_element.click()
time.sleep(15)
解决方案

你当前代码的核心问题是过度依赖硬编码的time.sleep(稳定性差且效率低),同时元素定位方式过于脆弱(长CSS选择器极易因页面结构微调失效)。针对页面使用的MUI Autocomplete组件,我们可以改用显式等待确保元素加载完成,再通过更稳定的定位逻辑操作下拉选项。

修改后的代码如下:

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

url = 'https://directory.brcgs.com/'
driver = webdriver.Chrome(executable_path=ChromeDriverManager().install())
driver.get(url)
driver.maximize_window()

# 初始化显式等待,最长等待20秒
wait = WebDriverWait(driver, 20)

# 等待Country折叠面板可点击并展开
country_panel = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[contains(text(), 'Country')]/ancestor::div[contains(@class, 'filter-row')]")))
country_panel.click()

# 等待并点击Autocomplete输入框,触发下拉列表展开
autocomplete_input = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div[aria-label='Country'] input")))
autocomplete_input.click()

# 等待首个下拉选项加载完成并点击
first_option = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "[id$='-option-0']")))
first_option.click()

关键优化点说明:

  • 替换硬等待为显式等待:WebDriverWait配合expected_conditions,只有当元素满足可点击/可见条件时才执行操作,避免因网络或页面渲染延迟导致的元素找不到问题。
  • 更稳定的定位逻辑:
    • 用文本匹配定位Country面板,避免依赖冗长的层级选择器。
    • 用aria-label定位输入框,MUI组件的这个属性不会随页面加载动态变化,比动态生成的ID更可靠。
    • 用[id$='-option-0']匹配首个选项,$=表示ID以-option-0结尾,无需关心前面的动态前缀。

如果需要选择特定国家(比如奥地利),可以在输入框中输入关键词后定位对应选项:

# 在输入框中输入目标国家名称
autocomplete_input.send_keys("Austria")
# 等待对应选项出现并点击
target_option = wait.until(EC.element_to_be_clickable((By.XPATH, "//li[contains(text(), 'Austria')]")))
target_option.click()

内容的提问来源于stack exchange,提问作者linus otte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:05:35