Selenium操作Google Teachable Machine遇NoSuchElementException求助
解决Selenium操作Google Teachable Machine时的NoSuchElementException问题
核心问题分析
你之前添加的iframe切换逻辑是错误的——页面根本不存在iframe,控制台返回空集合已经证明了这一点,这会导致Selenium脱离正确的页面上下文,引发新的定位错误。而最初的.add-classes元素定位失败,是因为页面动态渲染延迟,普通的元素查找在元素未加载完成时执行。
解决方案步骤
- 移除iframe切换代码:直接删除所有涉及
switch_to.frame的代码,因为页面没有嵌套iframe。 - 改用显式等待:通过
WebDriverWait等待元素满足可点击/可见状态,替代固定时长的sleep,更适配动态页面。 - 直接操作文件上传input:Teachable Machine的上传按钮是触发隐藏的文件输入框,定位这个
<input>元素并调用send_keys,比点击可视化按钮更稳定。
修正后的完整代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import os # 初始化浏览器 driver = webdriver.Chrome() driver.get("https://teachablemachine.withgoogle.com/train/image") driver.maximize_window() try: # 等待"添加类别"按钮可点击并点击 add_classes_btn = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.CSS_SELECTOR, ".add-classes")) ) add_classes_btn.click() # 假设要上传到第一个类别,先点击该类别的上传区域 upload_area = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.CSS_SELECTOR, ".class-container:nth-child(1) .upload-btn")) ) upload_area.click() # 定位隐藏的文件上传input元素 file_input = WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.CSS_SELECTOR, 'input[type="file"]')) ) # 批量上传图片:传入图片文件路径列表 image_paths = [ os.path.abspath("path/to/image1.jpg"), os.path.abspath("path/to/image2.jpg"), # 更多图片路径... ] # 将路径用换行符拼接,send_keys支持批量上传 file_input.send_keys("\n".join(image_paths)) finally: # 操作完成后可选择关闭浏览器,或者留着查看结果 # driver.quit() pass
额外注意事项
- 确保ChromeDriver版本与本地Chrome浏览器版本匹配,版本不兼容也可能导致元素定位异常。
- 如果需要上传到多个类别,重复执行"点击类别上传区域→定位input→send_keys"的逻辑即可。
- 若遇到元素被遮挡的情况,可尝试用
driver.execute_script强制点击元素,比如:driver.execute_script("arguments[0].click();", add_classes_btn)
内容的提问来源于stack exchange,提问作者조승주
相关产品推荐
相关产品推荐

