Selenium切换frame报ElementNotInteractableException 谷歌表单上传图片失败
问题原因
- 谷歌表单的上传弹窗frame在关闭后不会自动从DOM中移除,你第二次通过
find_element_by_class_name('picker-frame')匹配到的是第一个已经隐藏的旧frame,切换到隐藏frame后操作内部元素自然会触发不可交互报错。 - 谷歌生态的产品元素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
相关产品推荐
相关产品推荐

