多模块文件自动上传工具 — 基于 Selenium + PyAutoGUI 的 RPA 桌面应用

多模块文件自动上传工具 — 基于 Selenium + PyAutoGUI 的 RPA 桌面应用

MinjieY Lv1

项目背景

汽车供应链层级多、信息孤岛严重,上游供应商的库存、订单数据难以实时互通,人工处理效率低、风险预判滞后。汽车供应链企业集群库存数据集成与 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
2
3
4
5
6
7
├── multi_upload_gui.py      # 主程序
├── test_error_capture.py # WebDriver 导入诊断脚本
├── drivers/ # Edge WebDriver
├── uploadTest/ # 测试用 Excel 上传模板
├── upload_logs/ # 运行日志与失败截图
├── build/ # PyInstaller 构建中间产物
└── dist/ # 打包后的 EXE 文件

设计逻辑

整体架构

程序采用单类 MVC 混合模式,所有逻辑集中在 MultiUploadApp 类中,以 Tkinter 作为视图层,通过多线程实现并发控制和 UI 不阻塞。整体分为以下核心子系统:

1
2
3
4
5
6
7
8
9
10
11
┌─────────────────────────────────────────────────────┐
│ MultiUploadApp │
├──────────────┬──────────────┬───────────────────────┤
│ UI 层 │ 控制层 │ 执行层 │
│ (Tkinter) │ (Scheduler) │ (Selenium + PyAutoGUI)│
├──────────────┼──────────────┼───────────────────────┤
│ 模块面板 │ 定时调度器 │ 浏览器驱动管理 │
│ 日志面板 │ 状态机控制 │ 登录流程 │
│ 验证码交互 │ 线程管理 │ 导航与上传 │
│ 配置持久化 │ 文件去重 │ 结果记录与截图 │
└──────────────┴──────────────┴───────────────────────┘

1. 依赖自检与自动安装机制

程序启动时首先调用 check_dependencies(),检测 seleniumpyautoguipyperclipPillow 是否可用。若缺失,通过 subprocess 调用 pip 从清华镜像源自动安装,确保在无环境的机器上也能直接运行。

1
2
3
4
5
6
# 自动安装逻辑
subprocess.check_call([
PYTHON_313, "-m", "pip", "install",
"selenium", "webdriver-manager", "pyautogui", "pyperclip", "Pillow",
"-i", "https://pypi.tuna.tsinghua.edu.cn/simple"
])

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
2
3
4
5
6
7
8
9
10
11
12
13
14
module_widgets[key] = {
'name': "模块名称",
'url_var': "目标URL",
'path_var': "Excel文件目录",
'schedule_interval_var': "定时间隔",
'schedule_unit_var': "定时单位(min/小时/天/周)",
'status_label': "状态标签",
'progress_bar': "进度条",
'progress_label': "进度文字",
'is_running': False/True,
'schedule_timer': "定时器句柄",
'last_upload_label': "上次上传时间标签",
'file_info_text': "文件信息展示区"
}
  • 每个模块独立设置 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\BLBeaconversion),然后从 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
2
3
4
5
启动线程 → 初始化浏览器 → 导航到登录页 → 截图验证码
→ 将验证码图片显示到 GUI Canvas → 等待用户输入
→ 用户点击"确认验证码" → 继续线程执行
→ 填写用户名密码 + 验证码 → 点击登录
→ 检测登录是否成功 → 更新 UI 状态

关键设计点:

  • 验证码图片通过 PIL.ImageTk.PhotoImage 渲染到 Tkinter Canvas 上显示
  • 使用 threading.Eventcaptcha_event)实现线程间同步等待
  • 登录成功后所有模块的”执行”按钮才可用,避免未登录就执行上传

7. 上传流程设计

上传流程是核心自动化逻辑,采用分步执行 + 检查点模式

1
2
3
4
5
6
7
8
9
1. 扫描文件目录 → 取最新 Excel 文件 → 检查文件修改时间是否已上传过
2. 确保浏览器存活(get_driver_safe)
3. 导航到目标模块页面 URL
4. 等待页面加载,定位并点击"上传"按钮
5. 等待系统文件对话框弹出 → 使用 PyAutoGUI 快捷键 Ctrl+L 定位地址栏
→ pyperclip 粘贴文件路径 → 按 Enter 确认
6. 等待上传完成 → 判断成功/失败
7. 记录上传结果到 upload_logs/upload_results.log
8. 失败时截图保存到 upload_logs/screenshots/

为什么使用 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
2
3
4
用户设置间隔(interval) + 单位(min/小时/天/周)
→ 转换为秒数 → 创建 Timer(seconds, callback)
→ 时间到 → 执行上传流程 → 上传完成后递归调用 _schedule_next_run()
→ 形成循环定时链

关键设计:

  • 使用 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

使用说明

  1. 启动程序后,在对应模块中设置目标 URL 和 Excel 文件所在目录
  2. 点击”执行”按钮,若未登录则自动引导登录流程
  3. 在 GUI 中查看验证码图片并输入验证码完成登录
  4. 程序自动完成页面导航和文件上传
  5. 可在日志面板中实时查看每个模块的上传进度和结果
  6. 设置定时间隔和单位后点击”定时关”按钮可开启定时上传

注意事项

  • 上传过程中请勿手动操作浏览器,以免干扰自动化流程
  • 如果上传失败,可在 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.
Comments