在自动化测试和网页爬虫开发中,文件上传是一个常见需求。本文将详细介绍如何使用python的drissionpage库实现高效稳定的文件上传操作,涵盖基础原理、核心方法和实战案例。
一、drissionpage上传文件的核心原理
drissionpage是一个基于selenium和requests的混合驱动库,它简化了浏览器自动化操作。网页中的文件上传通常通过两种方式实现:
- 直接操作隐藏的input元素:大多数网页使用
<input type="file">元素实现上传功能,即使前端用美观的按钮覆盖,底层仍依赖该元素。 - 处理javascript动态生成的上传组件:部分复杂网页使用js动态创建上传控件,需要特殊处理。
二、基础文件上传实现
1. 最简上传示例
from drissionpage import chromiumpage
# 初始化浏览器
page = chromiumpage()
page.get('https://example.com/upload') # 替换为实际上传页面
# 直接定位file input并上传
file_input = page.e('input[type="file"]') # css选择器
file_input.send_keys(r'c:\test\sample.jpg') # 发送文件路径
2. 完整流程封装
def upload_file(page, url, file_path):
"""
通用文件上传函数
:param page: drissionpage对象
:param url: 上传页面url
:param file_path: 本地文件路径
:return: 是否上传成功
"""
try:
page.get(url)
# 等待上传元素加载(显式等待更可靠)
upload_input = page.wait('@input[type="file"]', timeout=10)
upload_input.send_keys(file_path)
return true
except exception as e:
print(f"上传失败: {str(e)}")
return false
三、实战案例:批量上传图片并处理结果
以下是一个完整的实战案例,实现批量上传图片到百度ai平台并处理识别结果:
import os
import re
import time
import random
from drissionpage import chromiumpage
# 配置参数
target_dir = r'g:\验证码项目\抖音九宫格语义点选验证码\图片\temp改名文件夹/'
source_dir = r'g:\验证码项目\抖音九宫格语义点选验证码\图片\3裁剪后的图片\'
upload_url = 'https://chat.baidu.com/search'
def process_images():
# 初始化浏览器
page = chromiumpage()
# 确保目标目录存在
os.makedirs(target_dir, exist_ok=true)
# 获取所有图片
image_files = [f for f in os.listdir(source_dir) if f.lower().endswith(('.jpg', '.png'))]
for img_name in image_files:
img_path = os.path.join(source_dir, img_name)
try:
# 上传流程
page.get(upload_url)
# 点击上传按钮(根据实际页面结构调整)
upload_btn = page.ele('xpath://div[contains(@class,"upload-btn")]')
upload_btn.click()
# 操作隐藏的file input
file_input = page.ele('input[type="file"]')
file_input.send_keys(img_path)
# 填写表单(示例)
textarea = page.ele('textarea[id="chat-textarea"]')
textarea.input("请识别图片中的内容,用【】标注结果")
# 提交
submit_btn = page.ele('img[class*="submit-button"]')
submit_btn.click()
# 等待结果(根据实际页面调整等待条件)
time.sleep(5)
# 提取识别结果
result_div = page.ele('div[class*="marklang"]')
result_text = result_div.text
print(f"识别结果: {result_text}")
# 解析结果
matches = re.findall(r'【(.*?)】', result_text)
if matches:
# 生成新文件名
new_name = f"{matches[0]}_{int(time.time()*1000)}_{random.randint(1000,9999)}.jpg"
new_path = os.path.join(target_dir, new_name)
# 移动文件(先删除已存在的同名文件)
if os.path.exists(new_path):
os.remove(new_path)
os.rename(img_path, new_path)
print(f"文件已重命名为: {new_name}")
except exception as e:
print(f"处理图片 {img_name} 时出错: {str(e)}")
continue
if __name__ == '__main__':
process_images()
四、高级技巧与注意事项
1. 处理动态加载的上传组件
对于使用javascript动态生成的上传组件,可以尝试:
# 方法1:先点击触发按钮再操作input
trigger_btn = page.ele('button[data-action="upload"]')
trigger_btn.click()
file_input = page.ele('input[type="file"]') # 现在应该可见
file_input.send_keys(file_path)
# 方法2:直接执行js触发点击
page.run_js('document.queryselector("input[type=file]").click()')
2. 多文件上传
# 支持多选的上传(需页面允许)
file_input = page.ele('input[type="file"][multiple]')
file_input.send_keys([
r'c:\test\file1.jpg',
r'c:\test\file2.png'
])
3. 等待策略优化
# 更可靠的等待方式
from drissionpage.common import wait
# 等待元素出现(最多10秒)
upload_input = wait(page).until(lambda p: p.ele('input[type="file"]'))
# 或者使用显式等待
page.wait('@input[type="file"]', timeout=10)
4. 常见问题解决
文件路径问题:
- 始终使用绝对路径
- windows路径使用原始字符串(前缀
r)或双反斜杠
元素定位失败:
- 检查元素是否在iframe中(需要先切换)
- 确认页面是否完全加载
- 尝试多种定位方式(css/xpath)
浏览器兼容性:
- 确保chromedriver版本与浏览器匹配
- 考虑使用无头模式(
options.set_headless())
五、性能优化建议
- 复用浏览器实例:避免频繁启动关闭浏览器
- 并行处理:使用多线程/多进程处理大量文件
- 异常重试机制:对失败操作自动重试
- 日志记录:详细记录上传过程和结果
六、总结
drissionpage提供了简洁高效的文件上传实现方式,通过直接操作隐藏的<input type="file">元素,可以绕过复杂的前端交互逻辑。掌握本文介绍的核心方法和实战技巧后,您可以轻松实现各种文件上传自动化需求。
对于更复杂的场景,建议结合drissionpage的等待机制、异常处理和javascript执行能力,构建健壮的自动化流程。在实际项目中,还应考虑添加进度显示、结果验证和错误恢复等功能,提升用户体验和系统可靠性。
到此这篇关于python使用drissionpage实现上传文件的实战指南的文章就介绍到这了,更多相关python drissionpage上传文件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论