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
相关产品推荐
相关产品推荐

