使用Selenium+Python在finanzen.net搜股票时遭遇ElementNotInteractableException
解决Selenium访问finanzen.net时ElementNotInteractableException的问题
我来帮你排查这个ElementNotInteractableException的问题,这类情况通常是元素还没准备好交互、被页面元素遮挡,或者定位到了非目标元素导致的。咱们一步步来解决:
可能的原因与对应解决方案
1. 定位到了非可见的匹配元素
页面上可能存在多个class为search-input的输入框(比如隐藏的备用输入框),导致你定位到的元素其实不可见。可以优化定位表达式,让它更精准:
- 尝试结合父容器的属性来定位,比如:
search_field = driver.find_element_by_xpath("//div[contains(@class, 'search-header')]//input[@class='search-input']") - 或者使用CSS选择器限定可见元素:
search_field = driver.find_element_by_css_selector("input.search-input:visible")
2. 用显式等待替代固定sleep
time.sleep(5)是固定等待,无法适配页面动态加载的情况,元素可能已经存在但还没达到可交互状态。改用显式等待可以确保元素就绪后再操作:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待cookie按钮可点击并关闭 cookie_banner_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//button[@onclick='cookieBannerOverlayClick();']")) ) cookie_banner_button.click() # 等待搜索框可交互后再输入 search_field = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//input[@class='search-input']")) ) search_field.send_keys('bmw') search_field.submit()
3. 用JavaScript绕过交互限制
如果元素确实存在但Selenium判定不可交互,可以直接通过JavaScript给输入框赋值,再触发搜索:
# 定位搜索框并赋值 search_field = driver.find_element_by_xpath("//input[@class='search-input']") driver.execute_script("arguments[0].value = 'bmw';", search_field) # 定位搜索按钮并点击(替代submit,避免表单关联问题) search_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//button[@type='submit' and contains(@class, 'search-button')]")) ) search_button.click()
4. 确保cookie弹窗完全关闭
有时候cookie按钮点击后弹窗不会立刻消失,可能短暂遮挡搜索框。可以在点击后等待弹窗不可见:
cookie_banner_button.click() # 等待cookie弹窗消失 WebDriverWait(driver, 10).until( EC.invisibility_of_element_located((By.XPATH, "//div[contains(@class, 'cookie-banner-overlay')]")) )
修改后的完整示例代码
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 import time chrome_options = webdriver.ChromeOptions() prefs = {"profile.default_content_setting_values.notifications" : 2} chrome_options.add_experimental_option("prefs", prefs) chrome_options.add_argument("start-maximized") driver = webdriver.Chrome(options=chrome_options, executable_path=r'F:\chromedriver.exe') driver.get('https://www.finanzen.net/') try: # 处理cookie弹窗 cookie_banner_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//button[@onclick='cookieBannerOverlayClick();']")) ) cookie_banner_button.click() # 等待弹窗消失 WebDriverWait(driver, 10).until( EC.invisibility_of_element_located((By.XPATH, "//div[contains(@class, 'cookie-banner')]")) ) # 处理搜索框 search_field = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//input[@class='search-input']")) ) search_field.send_keys('bmw') search_field.submit() # 等待搜索结果加载 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, "//div[contains(@class, 'search-results')]")) ) finally: time.sleep(2) # 可选,用于查看结果 driver.quit()
内容的提问来源于stack exchange,提问作者Tyler_Durdun
相关产品推荐
相关产品推荐

