求助:使用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
相关产品推荐
相关产品推荐

