PyAutoGUI解决什么问题
很多软件和网页没有API接口,但你每天要重复同样的操作——填表单、点按钮、上传文件、截图存档。PyAutoGUI通过模拟鼠标移动、点击和键盘输入来自动化这些GUI操作。它不依赖应用程序的内部接口,只要是屏幕上能看到的东西都能操作,适用范围极广。
第一步:安装与环境配置
安装PyAutoGUI及辅助库:
pip install pyautogui pygetwindow opencv-python pillow
各库分工:PyAutoGUI负责鼠标键盘模拟,pygetwindow管理窗口,opencv-python用于图像识别定位,pillow用于截图。
验证安装:
import pyautogui
print(pyautogui.size()) # 输出屏幕分辨率
安全设置(重要):PyAutoGUI内置防失控机制,将鼠标移到屏幕左上角(0,0)会触发FailSafeException立即停止脚本。测试时务必保持这个默认设置。
第二步:屏幕定位与鼠标操作
PyAutoGUI有两种定位方式:坐标定位和图像识别定位。
坐标定位适合固定窗口位置的场景:
import pyautogui
pyautogui.click(500, 300) # 点击坐标(500,300)
pyautogui.doubleClick(500, 300) # 双击
pyautogui.rightClick(500, 300) # 右键
pyautogui.moveTo(500, 300, duration=0.5) # 0.5秒移动到目标
图像识别定位更稳定,适合窗口位置可能变化的场景:
location = pyautogui.locateOnScreen(‘button.png’, confidence=0.9)
if location:
pyautogui.click(location)
confidence参数设置匹配精度0-1,0.9表示90%相似度即可。这种方式不依赖坐标,只要按钮长一样就能找到。截图方法:用系统截图工具截取目标按钮区域保存为PNG。
进阶:locateCenterOnScreen返回匹配区域的中心坐标,直接点击更精确。
第三步:键盘输入模拟
基础输入:
pyautogui.write(‘Hello World’, interval=0.05) # 每个字符间隔0.05秒
pyautogui.press(‘enter’) # 按回车
pyautogui.hotkey(‘ctrl’, ‘c’) # Ctrl+C复制
pyautogui.hotkey(‘ctrl’, ‘v’) # Ctrl+V粘贴
中文输入需要特殊处理,因为write方法不支持中文。两种方案:
- 用pyperclip复制到剪贴板再粘贴——pyperclip.copy(‘中文内容’); pyautogui.hotkey(‘ctrl’, ‘v’)
- 用pynput库直接模拟中文输入法——更复杂但不需要剪贴板
推荐第一种方案,简单可靠。安装pyperclip:pip install pyperclip
第四步:批量表单填写实战
场景:在一个不支持API的内部系统中批量录入100条客户数据。数据存在Excel中。
完整脚本结构:
import pyautogui
import pyperclip
import pandas as pd
import time# 读取数据
df = pd.read_excel(‘客户数据.xlsx’)# 切换到目标窗口
import pygetwindow as gw
win = gw.getWindowsWithTitle(‘客户管理系统’)[0]
win.activate()
time.sleep(1)for idx, row in df.iterrows():
# 点击姓名输入框
pyautogui.click(300, 200)
time.sleep(0.3)
# 清空并输入姓名
pyautogui.hotkey(‘ctrl’, ‘a’)
pyperclip.copy(str(row[‘姓名’]))
pyautogui.hotkey(‘ctrl’, ‘v’)
# Tab到下一个字段
pyautogui.press(‘tab’)
time.sleep(0.3)
# 输入电话
pyperclip.copy(str(row[‘电话’]))
pyautogui.hotkey(‘ctrl’, ‘v’)
# 点击保存按钮
pyautogui.click(500, 600)
time.sleep(1)
# 点击新增按钮
pyautogui.click(600, 600)
time.sleep(0.5)
print(f’已完成 {idx+1}/{len(df)}’)
关键点:每个操作后加time.sleep等待界面响应,时间太短会导致操作错位。不同系统响应速度不同,建议从0.5秒开始测试,逐步缩短。
第五步:异常处理与日志
无人值守脚本必须有异常处理:
try:
# 核心操作
pyautogui.click(target)
except pyautogui.ImageNotFoundException:
print(‘未找到目标元素,截图保存’)
pyautogui.screenshot(f’error_{timestamp}.png’)
# 尝试恢复或跳过
except Exception as e:
print(f’未知错误: {e}’)
pyautogui.screenshot(f’crash_{timestamp}.png’)
raise
每次出错时自动截图保存现场,方便排查。进阶建议加一个计数器,连续失败超过3次就停止整个脚本,避免在错误状态下继续操作。
常见问题与误区
- 坐标写死在脚本里——换台电脑或窗口位置变了就失效。优先用图像识别定位,坐标作为备选
- 不等待界面响应——点完按钮立刻做下一步,界面还没加载出来。每个关键操作后必须sleep
- 不做异常处理——无人值守脚本跑一半出错,鼠标乱飞。try-except加截图加失败计数器三件套
- 忽视安全机制——把FailSafe关掉,脚本失控时无法停止。务必保留默认的左上角触发机制
- 中文输入报错——write不支持中文,必须用剪贴板方案。这是最常见的坑
效率数据
实测:在内部系统中录入100条客户数据(每条5个字段),纯手工约2.5小时,PyAutoGUI脚本约15分钟(含调试时间)。批量截图100个网页特定区域,手工约50分钟,脚本约5分钟。核心建议是:PyAutoGUI适合没有API的场景,有API优先用API。GUI自动化的稳定性不如API,适合一次性批量任务或低频操作,不适合高频实时场景。