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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:17:29