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

Selenium Web自动化遇Element Not Interactable异常,无法输入内容求助

问题

无法向DKB银行登录页的用户名和密码输入框输入内容,每次触发ElementNotInteractableException异常。已尝试隐式等待、显式等待,以及通过JavaScript点击字段并设置值,但均无效。

附上代码:

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, ElementNotInteractableException
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
import sys


def main():
    path = r'path\\to\\chromedriver.exe'
    options = webdriver.ChromeOptions()
    driver = webdriver.Chrome(executable_path=path, options=options)
    driver.get("https://banking.dkb.de/login")

    try:
        # 拒绝所有Cookie
        frame = driver.find_element(By.XPATH, "//iframe[@id='privacy-iframe']")
        driver.switch_to.frame(frame)
        button = driver.find_element(By.XPATH, "//button[@aria-label='Refuse all cookies']")
        button.click()

        # 重新加载页面以定位元素
        driver.get("https://banking.dkb.de/login")

        # 登录操作
        element = driver.find_element(By.XPATH, "//input[@id='username']")
        element.send_keys("123456789")
        element = driver.find_element(By.XPATH, "//input[@id='password']")
        element.send_keys("abcdefg")
        element = driver.find_element(By.XPATH, "//div[@class='sc-11z3xzm-3 bFajen']/button")
        element.click()

    except NoSuchElementException:
        print('Element not found')
        driver.close()
        driver.quit()
        sys.exit(0)

    except TimeoutException:
        print('Timeout exception')
        driver.close()
        driver.quit()
        sys.exit(0)

    except ElementNotInteractableException:
        print('Element not interactable')
        driver.close()
        driver.quit()
        sys.exit(0)


main()

网站HTML截图

解决方案

1. 确认登录元素所在的iframe

从HTML截图判断,登录表单大概率嵌套在独立iframe中。处理Cookie弹窗后,无需刷新页面,直接切换回主文档,再定位并切换到登录表单所在的iframe:

# 拒绝Cookie后切换回主文档
driver.switch_to.default_content()

# 等待并切换到登录表单的iframe(需根据实际HTML调整定位规则)
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

login_frame = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, "//iframe[contains(@src, 'login')]"))
)
driver.switch_to.frame(login_frame)

2. 用显式等待确保元素可交互

直接定位元素可能遇到未完全渲染的情况,必须等待元素处于可点击/输入状态再操作:

# 等待用户名输入框可交互
username_input = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.ID, "username"))
)
username_input.send_keys("123456789")

# 等待密码输入框可交互
password_input = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.ID, "password"))
)
password_input.send_keys("abcdefg")

# 等待登录按钮可交互
login_button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//div[@class='sc-11z3xzm-3 bFajen']/button"))
)
login_button.click()

3. 正确使用JavaScript设置值(极端情况)

如果元素始终无法交互,尝试用JavaScript直接设置输入框value,并触发必要的事件:

username_input = driver.find_element(By.ID, "username")
driver.execute_script("arguments[0].value = '123456789';", username_input)
# 触发change事件,确保网站感知到输入
driver.execute_script("arguments[0].dispatchEvent(new Event('change'));", username_input)

password_input = driver.find_element(By.ID, "password")
driver.execute_script("arguments[0].value = 'abcdefg';", password_input)
driver.execute_script("arguments[0].dispatchEvent(new Event('change'));", password_input)

4. 检查并等待遮罩层消失

部分网站加载时会有遮罩层遮挡输入框,需等待遮罩层消失后再操作:

# 等待加载遮罩层消失(需根据实际class调整)
WebDriverWait(driver, 10).until(
    EC.invisibility_of_element_located((By.CLASS_NAME, "loading-overlay"))
)

内容的提问来源于stack exchange,提问作者SeverOmpty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:54:52