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

Python Selenium使用send_keys报元素不可交互异常的解决方法

问题根因

你遇到的 ElementNotInteractableException: element not interactable 报错,完全是元素定位错误导致的:

  • 你之前选的两个<span>标签都是纯UI展示用的元素:<span>本身是行内容器,默认不支持接收键盘输入,不管是透明度为1的空白span,还是显示Città o Stazione占位文本的span,都不是实际承载输入功能的表单控件,对这类元素调用send_keys()必然报错。
  • 你完全忽略了HTML结构里真正的输入元素:结构最开头的<input type="text" autocomplete="off">才是实际接收用户输入的控件,你的代码全程没有定位这个元素。
  • 额外的稳定性隐患:初始状态下这个input的opacity为0.5,属于未激活的半透明状态,如果元素还没加载完成、或者没激活就直接操作,也可能触发交互异常。
正确实现方法

操作这类自定义样式的输入框,核心是定位原生input控件,不要被外层的展示用标签误导,同时搭配显式等待保证元素处于可交互状态,参考代码如下:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 初始化显式等待,最长等待10秒直到元素可点击
wait = WebDriverWait(driver, 10)
# 定位真正的input输入框,避免用易变的style属性做定位条件
city_input = wait.until(
    EC.element_to_be_clickable((By.XPATH, '//input[@type="text" and @autocomplete="off"]'))
)

# 点击激活输入框
city_input.click()
# 清空默认内容后输入目标文本
city_input.clear()
city_input.send_keys("some city or station")

异常排查补充

如果上述代码仍然报错,按以下优先级检查:

  • 确认input元素是否嵌套在<iframe>标签内,如果存在iframe嵌套,需要先调用driver.switch_to.frame()切换到对应iframe后再定位元素
  • 如果页面存在多个属性匹配的input,缩小定位范围,比如先定位输入框的父级容器,再在容器范围内查找input,避免定位到其他隐藏的同名元素
  • 不要用style、临时class这类动态变化的属性作为定位依据,这类属性会随页面交互实时修改,定位稳定性极差

内容的提问来源于stack exchange,提问作者Luca Giovanni Voglino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:51:19