多模块文件自动上传工具 — 基于 Selenium + PyAutoGUI 的 RPA 桌面应用
项目背景
汽车供应链层级多、信息孤岛严重,上游供应商的库存、订单数据难以实时互通,人工处理效率低、风险预判滞后。汽车供应链企业集群库存数据集成与 AI 智能治理研究提出了一套 API 对接 + AI 大数据分析 的智能库存管理方案。
本项目是该研究中的一个落地小工具:SupplyAutoUpload 承担了其中 Excel 数据批量上传到 SupplyOne 供应链管理平台 的 RPA 自动化环节——在上下游系统尚未完成 API 直连对接的阶段,通过桌面自动化打通数据入口,覆盖供应商500余家。
业务背景文章:【思享汇】汽车供应链企业集群库存数据集成与 AI 智能治理研究 ——上海市供应链发展促进会
项目简介
一个基于 Selenium + PyAutoGUI 的桌面端 RPA 自动化工具,用于在 SupplyOne 供应链管理平台 上批量上传供应商零件库存、下级零件库存和原材料到货计划 Excel 数据。
GitHub: https://github.com/MinjieY/SupplyAutoUpload
供应链库存管理平台: https://supplyone-stg.ap1.covapp.io/#/login
功能特性
三个业务模块支持
- 供应商零件库存 (
/ground/supplierStock) - 供应商下级零件库存 (
/ground/2bStock) - 原材料到货计划 (
/ground/2bStock)
- 供应商零件库存 (
全自动化流程
- 自动启动 Edge 浏览器并登录 SupplyOne 平台
- 验证码展示与人工输入
- 自动导航到目标页面并点击上传按钮
- 通过 PyAutoGUI 操控系统文件对话框,实现文件路径粘贴上传
- 上传结果判断与失败截图留存
定时任务
- 每个模块支持独立设置定时上传(分钟/小时/天/周)
- 文件修改时间去重,避免重复上传
图形化界面
- Tkinter 桌面 GUI,支持多标签页
- 实时日志面板,支持分模块查看
- 进度条与状态指示
开机自启
- 支持通过 Windows 注册表设置开机自动启动
WebDriver 自动管理
- 自动检测 Edge 浏览器版本并下载匹配的 msedgedriver
技术栈
| 层级 | 技术 |
|---|---|
| 语言 | Python 3.13 |
| GUI | Tkinter |
| 浏览器自动化 | Selenium WebDriver (Edge) |
| 桌面自动化 | PyAutoGUI + Pyperclip |
| 图片处理 | Pillow (PIL) |
| 打包分发 | PyInstaller |
项目结构
1 | ├── multi_upload_gui.py # 主程序 |
设计逻辑
整体架构
程序采用单类 MVC 混合模式,所有逻辑集中在 MultiUploadApp 类中,以 Tkinter 作为视图层,通过多线程实现并发控制和 UI 不阻塞。整体分为以下核心子系统:
1 | ┌─────────────────────────────────────────────────────┐ |
1. 依赖自检与自动安装机制
程序启动时首先调用 check_dependencies(),检测 selenium、pyautogui、pyperclip、Pillow 是否可用。若缺失,通过 subprocess 调用 pip 从清华镜像源自动安装,确保在无环境的机器上也能直接运行。
1 | # 自动安装逻辑 |
2. 日志系统设计
自定义 LogHandler 类继承 logging.Handler,通过消息队列 + Tkinter after 定时刷新的异步模式,将 Python 标准 logging 输出桥接到 GUI 的 Text 组件中:
emit()将日志消息推入队列,通过root.after(100, process_queue)延迟刷新process_queue()批量消费队列中的消息并写入 Text 组件- 支持
enable/disable控制,防止窗口关闭后仍然尝试写入已销毁的控件 - 每个模块拥有独立的日志 Tab,全局日志 Tab 汇总所有输出
3. 多模块管理架构
三个业务模块通过 MODULES 列表统一配置,每个模块拥有独立的数据结构存储于 self.module_widgets 字典中:
1 | module_widgets[key] = { |
- 每个模块独立设置 URL、文件目录、定时参数
- 模块面板支持折叠/展开(
toggle_module) - 顶部导航栏提供快速跳转到指定模块(
_scroll_to_module)
4. 配置持久化
所有模块配置(URL、路径、定时参数)和全局设置(登录URL、用户名、密码)通过 app_config.json 持久化:
save_config()/save_module_config()在用户修改任何设置时自动保存load_config()在程序启动时恢复上次配置- 配置结构清晰分层:
global保存全局设置,每个模块 key 保存模块专属设置
5. 浏览器驱动管理
Edge WebDriver 管理包含三个关键步骤:
a) 版本检测: 通过查询 Windows 注册表获取 Edge 浏览器版本号(HKLM\SOFTWARE\Microsoft\Edge\BLBeacon → version),然后从 https://msedgedriver.azureedge.net/ 匹配下载对应版本的驱动。
b) 驱动初始化: 使用 selenium.webdriver.Edge 创建浏览器实例,配置 detach 选项防止浏览器在程序结束时自动关闭,同时配置 user-data-dir 持久化浏览器状态。
c) 线程安全: 使用 threading.Lock 保护 self.driver 的读写操作(get_driver_safe / safe_driver_quit),避免多线程并发访问浏览器对象导致崩溃。
6. 登录流程设计
登录采用非阻塞异步模式,通过 threading.Thread 在后台执行:
1 | 启动线程 → 初始化浏览器 → 导航到登录页 → 截图验证码 |
关键设计点:
- 验证码图片通过
PIL.ImageTk.PhotoImage渲染到 Tkinter Canvas 上显示 - 使用
threading.Event(captcha_event)实现线程间同步等待 - 登录成功后所有模块的”执行”按钮才可用,避免未登录就执行上传
7. 上传流程设计
上传流程是核心自动化逻辑,采用分步执行 + 检查点模式:
1 | 1. 扫描文件目录 → 取最新 Excel 文件 → 检查文件修改时间是否已上传过 |
为什么使用 PyAutoGUI 而非 Selenium 处理文件选择?
Selenium 无法直接操控操作系统原生的文件选择对话框(<input type="file"> 除外),而 SupplyOne 平台的上传按钮触发的是系统级文件对话框。因此采用 PyAutoGUI 模拟键盘操作(Ctrl+L → 粘贴路径 → Enter)来完成文件选择。
8. 文件去重机制
通过 log_upload_result() 和 is_file_already_uploaded() 实现基于文件修改时间的去重:
- 每次上传成功后,将文件名、修改时间和模块名记录到
upload_logs/upload_results.log - 上传前读取日志文件,检查当前文件的修改时间是否与上次记录一致
- 若一致则跳过上传,避免重复提交相同数据
9. 定时调度器设计
每个模块拥有独立的定时器,通过 threading.Timer 实现:
1 | 用户设置间隔(interval) + 单位(min/小时/天/周) |
关键设计:
- 使用
scheduled_run标志区分手动触发和定时触发,定时触发时不弹窗打扰用户 - 用户可随时点击”定时关”按钮取消定时
- 程序退出时通过
cleanup()取消所有活跃的定时器
10. 用户中断机制
stop_requested 标志位 + check_stop() 检查点模式:
- 用户点击”停止”按钮 → 设置
stop_requested = True+ 调用safe_driver_quit() - 上传流程的每个关键步骤之间调用
check_stop() - 若标志位为 True,抛出异常终止当前流程
- 异常被外层
try/except捕获,优雅清理状态
11. 开机自启实现
通过操作 Windows 注册表 HKCU\Software\Microsoft\Windows\CurrentVersion\Run 键值实现:
- 启用:写入程序 EXE 路径
- 禁用:删除对应键值
- 通过
winreg标准库操作,无需第三方依赖
快速开始
环境要求
- Windows 操作系统
- Microsoft Edge 浏览器
- Python 3.13+
安装依赖
1 | pip install selenium pyautogui pyperclip Pillow |
或运行程序时会自动从清华镜像源安装缺失依赖。
运行
1 | python multi_upload_gui.py |
打包为 EXE
1 | pyinstaller --onefile --windowed --name "多模块文件上传工具" multi_upload_gui.py |
使用说明
- 启动程序后,在对应模块中设置目标 URL 和 Excel 文件所在目录
- 点击”执行”按钮,若未登录则自动引导登录流程
- 在 GUI 中查看验证码图片并输入验证码完成登录
- 程序自动完成页面导航和文件上传
- 可在日志面板中实时查看每个模块的上传进度和结果
- 设置定时间隔和单位后点击”定时关”按钮可开启定时上传
注意事项
- 上传过程中请勿手动操作浏览器,以免干扰自动化流程
- 如果上传失败,可在
upload_logs/screenshots/中查看失败截图 - WebDriver 版本需与 Edge 浏览器版本匹配,程序会自动检测并下载
- 文件修改时间去重基于
upload_logs/upload_results.log,如需重新上传同一文件请先修改文件内容
- Title: 多模块文件自动上传工具 — 基于 Selenium + PyAutoGUI 的 RPA 桌面应用
- Author: MinjieY
- Created at : 2026-07-28 00:00:00
- Updated at : 2026-08-05 16:04:37
- Link: https://github.com/MinjieY/post/8f8f4947.html
- License: This work is licensed under CC BY-NC-SA 4.0.