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,适合一次性批量任务或低频操作,不适合高频实时场景。