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

Selenium切换frame报ElementNotInteractableException 谷歌表单上传图片失败

问题原因

  1. 谷歌表单的上传弹窗frame在关闭后不会自动从DOM中移除,你第二次通过find_element_by_class_name('picker-frame')匹配到的是第一个已经隐藏的旧frame,切换到隐藏frame后操作内部元素自然会触发不可交互报错。
  2. 谷歌生态的产品元素ID都是动态生成的,你代码里写死的//*[@id=":6"]这类定位规则,第二次打开上传弹窗时ID已经发生变化,也会导致匹配到无效元素。

修复方案

首先导入Selenium的显性等待相关模块,替换硬等待逻辑,同时修改定位规则,只匹配可见的frame和稳定的元素属性:

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

option = webdriver.ChromeOptions()
driver = webdriver.Chrome("你的chromedriver路径")

# 登录逻辑和之前一致
driver.get("你的表单链接")
# 谷歌账号登录代码此处省略,保持你原有逻辑即可

wait = WebDriverWait(driver, 10)

# 第一个文件上传
first_upload_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="mG61Hd"]/div[2]/div/div[2]/div[1]/div/div/div[2]/div/div[2]/span')))
first_upload_btn.click()

# 等待可见的上传frame出现再切换
frame1 = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'picker-frame')))
driver.switch_to.frame(frame1)

# 替换动态ID定位,用文本匹配“我的云端硬盘”,可根据你实际界面显示的文本调整
drive_option = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[contains(text(),"我的云端硬盘")]')))
drive_option.click()

# 选择文件、确认的逻辑也替换为非ID的稳定定位
select_file = wait.until(EC.element_to_be_clickable((By.XPATH, '//div[contains(@data-id,"1oe7tESa9uNnUC75FdYuqzPtPbLYz7QFi")]/div[2]')))
select_file.click()

confirm_btn = wait.until(EC.element_to_be_clickable((By.ID, 'picker:ap:2')))
confirm_btn.click()

# 切回主文档后,等待第一个上传弹窗的frame完全隐藏
driver.switch_to.default_content()
wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, 'picker-frame')))

# 第二个文件上传
second_upload_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="mG61Hd"]/div[2]/div/div[2]/div[2]/div/div/div[2]/div/div[2]')))
second_upload_btn.click()

# 重新等待新的可见frame出现
frame2 = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'picker-frame')))
driver.switch_to.frame(frame2)

# 后续操作和第一个上传逻辑一致,使用稳定定位即可
drive_option2 = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[contains(text(),"我的云端硬盘")]')))
drive_option2.click()

补充说明

send_keys仅适用于本地上传场景,如果你是选择谷歌云端硬盘内的文件,确实需要走UI点击流程,按上述方案修改即可解决不可交互的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:06:04