1. Python自动化工具全景概览
第一次接触Python自动化是在2015年,当时需要批量处理上千个Excel文件。手动操作不仅效率低下,还容易出错。尝试用Pywin32写了个脚本后,原本需要3天的工作10分钟就完成了。这种"真香"体验让我彻底迷上了Python自动化。
Python生态中有四大主流自动化工具,各有专长:
- Pywin32:Windows API的直接调用者,适合深度控制Windows系统
- Pywinauto:Windows GUI自动化利器,比Pywin32更友好
- Pyautogui:跨平台的键鼠模拟专家
- Selenium:浏览器自动化的事实标准
这就像修车师傅的工具箱——你不会用扳手去拧螺丝,也不会用螺丝刀去敲钉子。选择对的工具,能让自动化事半功倍。我曾在一个电商项目中同时用到了这四种工具:Selenium采集商品数据,Pyautogui处理图片水印,Pywinauto操作ERP系统,Pywin32调用打印机接口。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Pywin32:Windows系统的瑞士军刀
2.1 核心能力解析
Pywin32就像Windows系统的后门钥匙。去年帮银行做RPA项目时,需要操作一个没有API的旧版CS架构系统,正是靠它解决了问题。其三大核心模块是:
- win32api:系统级操作(注册表、服务管理等)
- win32gui:窗口和控件操作
- win32con:Windows常量定义
查找窗口句柄是基础操作。有次我调试一个财务软件,用Spy++发现它的"确定"按钮其实是自定义控件,常规方法根本找不到。最终用这个代码定位到了:
python复制hwnd = win32gui.FindWindow(None, "财务系统V2.3")
button_hwnd = win32gui.FindWindowEx(hwnd, 0, "CustomButtonClass", None)
2.2 实战:银行对账自动化
某次需要自动处理500+个TXT对账单,每个文件要:
- 用记事本打开
- 菜单选择"另存为"
- 修改编码为UTF-8
- 保存到新目录
完整实现代码:
python复制import win32gui, win32con
# 打开文件
notepad = win32gui.FindWindow("Notepad", None)
win32gui.PostMessage(notepad, win32con.WM_COMMAND, 0x111, 0x0001) # 打开文件
# 后续菜单操作...
注意:SendMessage和PostMessage的区别在于前者会等待操作完成,后者是异步的。处理慢速应用时要用SendMessage。
3. Pywinauto:Windows GUI自动化首选
3.1 比Pywin32更智能的解决方案
Pywinauto最大的优势是能识别UI元素树。去年自动化一个Delphi开发的客户端时,发现它的backend用"uia"比"win32"识别率高出40%。典型工作流:
python复制from pywinauto import Application
app = Application(backend="uia").start("notepad.exe")
dlg = app.window(title="无标题 - 记事本")
dlg.menu_select("文件->另存为")
dlg["另存为"].set_edit_text("new_file.txt")
dlg["保存(S)"].click()
3.2 企业ERP系统实战
某制造业客户需要把每日生产数据从ERP导出到Excel。系统用WPF开发,控件结构复杂。关键技巧:
- 用Inspect.exe查看控件属性
- 发现DataGrid的AutomationId是固定前缀+日期
- 动态构建定位表达式:
python复制today_grid = app.window(auto_id=f"dataGrid_{datetime.today():%Y%m%d}")
4. Pyautogui:跨平台的最后防线
4.1 当其他工具失效时
遇到过最棘手的案例是个游戏登录器,没有任何标准控件。最终用Pyautogui的图像识别解决了:
python复制import pyautogui
login_btn_pos = pyautogui.locateOnScreen('login_button.png')
pyautogui.click(login_btn_pos)
为了提高识别率,我通常会:
- 截图时包含部分背景
- 设置confidence参数(0.8-0.9)
- 用灰度匹配加速
4.2 自动化测试中的妙用
在UI自动化测试中,经常需要验证界面显示。这个代码可以检查弹窗是否出现:
python复制try:
assert pyautogui.locateOnScreen('success.png') is not None
print("测试通过")
except:
print("测试失败")
5. Selenium:Web自动化的王者
5.1 元素定位最佳实践
做过最复杂的电商爬虫需要处理动态加载、验证码和反爬。总结出几个实用技巧:
- 优先用CSS选择器:
python复制driver.find_element(By.CSS_SELECTOR, "#loginForm > input.username")
- XPath备用方案:
python复制driver.find_element(By.XPATH, "//button[contains(text(),'提交')]")
- 智能等待:
python复制WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "dynamicContent"))
)
5.2 处理常见Web陷阱
- iframe切换:先定位iframe再操作内容
- 文件上传:直接用send_keys传文件路径
- 新窗口处理:记录window_handles前后变化
6. 工具选型决策树
根据上百个项目的经验,我总结出这个选择流程:
- 操作对象是浏览器? → Selenium
- 需要图像识别? → Pyautogui
- Windows原生程序?
- 标准控件 → Pywinauto
- 特殊控件 → Pywin32
- 跨平台需求 → Pyautogui
有个物流项目同时需要操作Web系统和本地客户端,最终方案是Selenium+Pyautogui组合,通过共享cookie实现无缝衔接。
7. 避坑指南
- 句柄变化问题:窗口最小化后句柄可能改变,解决方法是在操作前先激活窗口
- 控件识别失败:尝试换backend(win32/uia),或者改用图像识别
- 执行速度过快:在关键步骤后添加适当延迟
- 多显示器问题:Pyautogui的坐标是基于主屏幕的,需要做转换
最近遇到个典型案例:某财务软件在虚拟机里运行时,Pywinauto的点击操作总是不生效。最后发现是UI缩放设置导致坐标计算错误,通过调整DPI感知设置解决了问题。
