使用Python+Selenium循环上传PDF文件时遇文件未找到错误求助
解决Selenium循环上传文件时的"File not found"问题
我之前也碰到过一模一样的问题,手动输入路径正常,一循环就报错,大概率是路径字符串处理的跨平台兼容性问题,或者循环中元素定位的小细节没做好。咱们一步步来解决:
核心问题分析
手动输入的'C:\Scans\Test.pdf'其实在Python里是带转义的字符串(\S和\T刚好没触发转义冲突);但循环里pathlist中的路径,大概率是原生系统路径(比如Windows下的单反斜杠),直接传给send_keys会因为转义或者路径格式不被ChromeDriver识别导致报错。
另外,每次循环直接用find_element也可能踩坑:第一次上传后,页面可能刷新、元素被重新渲染,直接定位会拿到失效的元素引用。
跨平台解决方案(无需AutoIt)
1. 用Python内置的pathlib处理路径(推荐)
pathlib是Python3.4+自带的跨平台路径处理库,能自动适配Windows/Unix的路径分隔符,还能轻松获取绝对路径,完全不用手动处理转义:
from pathlib import Path from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import time for path in pathlist: if path.lower().endswith('pdf'): # 改成lower()避免大小写匹配问题 # 处理路径:转换成绝对路径,自动适配跨平台格式 file_path = Path(path).resolve() # 用显式等待确保元素可交互,避免页面刷新后元素失效 file_input = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//input[@name='attacheFile']")) ) # 把Path对象转成字符串传给send_keys file_input.send_keys(str(file_path)) # 等待上传完成(根据你的页面调整等待逻辑,比如等待上传进度条消失) time.sleep(2) # 或者用显式等待判断页面状态
2. 先排查路径本身的格式问题
先打印出pathlist中的路径,看看是不是有隐藏的转义或格式问题:
for path in pathlist: print(f"原始路径: {repr(path)}") # repr()会显示字符串的原始格式,包括转义符
如果看到路径里有\被转义成了特殊字符(比如\n、\t),说明路径字符串本身有问题,这时候用Path(path)也能自动修复。
3. 替代方案:用os.path处理路径
如果你习惯用os.path,也可以这样写,同样跨平台:
import os from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By for path in pathlist: if path.lower().endswith('pdf'): # 获取绝对路径,自动转换路径分隔符 abs_path = os.path.abspath(path) # 转成正斜杠格式(ChromeDriver也能识别) abs_path = abs_path.replace(os.sep, '/') file_input = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//input[@name='attacheFile']")) ) file_input.send_keys(abs_path)
为什么之前的方法没生效?
os.fsdecode:如果path本身已经是字符串,这个方法不会有任何效果;- 手动替换双反斜杠:容易因为Python的转义规则出错(比如
\\在字符串里其实是一个\); - 直接用
os.path.abspath:如果原始路径的转义有问题,abspath也无法修复,而pathlib会自动处理这类问题。
内容的提问来源于stack exchange,提问作者Fractale H




