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

Selenium调用send_keys遇ElementNotInteractableException问题求助

解决Selenium操作Proton.me输入框时的「element is not interactable」错误

以下是针对该问题的具体解决方案,按优先级尝试:

1. 用显式等待替代固定sleep

固定时长的time.sleep()无法保证元素完全加载并处于可交互状态,改用Selenium的显式等待,直到元素满足可点击条件再进行操作:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def createEmails():
    url = "https://account.proton.me/signup"  # 替换为实际目标URL
    driver = webdriver.Chrome()
    driver.get(url)

    print(f"{Fore.YELLOW}[!] Waiting for website to load fully.")
    
    # 最长等待10秒,直到邮箱输入框可交互
    usernameField = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, "email"))
    )
    
    username, password = generateData()
    usernameField.send_keys(username)

2. 滚动元素到可见视图

如果输入框不在当前浏览器视图范围内,Selenium可能无法交互,通过JS滚动到元素位置:

# 在找到元素后添加滚动操作
driver.execute_script("arguments[0].scrollIntoView(true);", usernameField)
usernameField.send_keys(username)

3. 筛选可见的目标元素

页面可能存在多个ID为email的元素(比如隐藏的备用输入框),此时需要筛选出可见的元素:

# 获取所有ID为email的元素,选择可见的那个
email_fields = driver.find_elements(By.ID, "email")
for field in email_fields:
    if field.is_displayed():
        usernameField = field
        break
usernameField.send_keys(username)

4. 处理遮挡元素(如Cookie弹窗)

Proton.me通常会弹出Cookie授权窗口,若弹窗遮挡输入框,需先关闭:

def createEmails():
    url = "https://account.proton.me/signup"
    driver = webdriver.Chrome()
    driver.get(url)

    print(f"{Fore.YELLOW}[!] Waiting for website to load fully.")
    
    # 尝试关闭Cookie弹窗
    try:
        cookie_btn = WebDriverWait(driver, 5).until(
            EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Accept')]"))
        )
        cookie_btn.click()
    except:
        # 无弹窗则跳过
        pass
    
    # 等待输入框可交互
    usernameField = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, "email"))
    )
    
    username, password = generateData()
    usernameField.send_keys(username)

5. 先激活输入框再输入

部分带JS交互的输入框需要先点击激活,再执行输入操作:

usernameField.click()  # 激活输入框
usernameField.send_keys(username)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:07:07