如何用Selenium选择非Select下拉菜单选项并解决元素不可交互报错
问题根因
- 该下拉为自定义实现,未使用原生
Select标签,无法通过Select类操作;你之前操作的始终是下拉的触发按钮,没有定位到展开后才加载的Custom选项元素,同时未等待元素完全可交互就执行操作,因此触发ElementNotInteractableException报错。 - 原代码未导入
time模块就调用time.sleep,也存在隐性报错。
修正方案
按「触发下拉展开→等待目标选项加载可交互→点击选项」的逻辑修改代码即可,参考代码如下:
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC import time url = 'https://www.mergermarket.com/homepage' driver = webdriver.Chrome() # 可替换为对应浏览器驱动 driver.get(url) # 等待deals元素可点击再跳转 deals = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="header"]/div/div[2]/nav/ul/li[4]/a')) ) urldeals = deals.get_attribute("href") driver.get(urldeals) # 等待下拉触发元素可点击,点击展开下拉 dropdown_trigger = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="searchCriteriaSummary"]/div[4]/div/div[2]/div/div[1]/div[2]/div/div/div[1]/div[1]')) ) dropdown_trigger.click() # 等待Custom选项加载可点击后点击 custom_option = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//*[text()='Custom' and not(contains(@style,'display:none'))]")) ) custom_option.click()
可选优化点
- 尽量用文本匹配、属性匹配的方式定位元素,避免过长的层级XPATH,页面结构变动时更不容易失效
- 优先用显式等待替代强制
sleep,提升脚本执行效率和稳定性
内容的提问来源于stack exchange,提问作者LaurieFalcon
相关产品推荐
相关产品推荐

