使用Selenium处理下拉框时XPath方法失效,报ElementNotInteractableException
解决Selenium点击自定义下拉框报错ElementNotInteractableException的问题
问题原因
目标网站的下拉框是自定义样式的伪下拉组件,原生的<select id="lang1">元素被CSS设置为隐藏状态(如display: none),直接定位原生<option>元素点击时,Selenium会判定元素不可见,抛出ElementNotInteractableException。
解决方案
方案一:模拟用户真实操作,点击自定义可见选项
直接操作页面上显示的自定义下拉选项,无需触碰原生隐藏元素:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC self.driver.get('https://pynishant.github.io/dropdown-selenium-python-select.html') self.driver.maximize_window() wait = WebDriverWait(self.driver, 20) # 点击自定义下拉容器,展开选项列表 drop_container = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "custom-select"))) drop_container.click() # 等待Python选项加载完成并点击 python_option = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[contains(@class, 'custom-options')]/div[text()='Python']"))) python_option.click()
方案二:通过JavaScript激活原生select元素
如果需要使用Selenium的Select类操作原生下拉框,先通过JS修改CSS让隐藏的select可见,再进行选择:
from selenium.webdriver.support.ui import Select from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC self.driver.get('https://pynishant.github.io/dropdown-selenium-python-select.html') self.driver.maximize_window() wait = WebDriverWait(self.driver, 20) # 定位原生select元素 select_element = wait.until(EC.presence_of_element_located((By.ID, "lang1"))) # 用JavaScript修改样式,让元素可见 self.driver.execute_script("arguments[0].style.display = 'block';", select_element) # 使用Select类选择value为3的Python选项 select = Select(select_element) select.select_by_value("3")
注意事项
- 优先选择方案一,完全贴合用户操作逻辑,避免修改页面元素可能引发的异常
- 替换代码中所有
sleep()为WebDriverWait显式等待,提升代码稳定性和执行效率
内容的提问来源于stack exchange,提问作者Mr Andreson
相关产品推荐
相关产品推荐

