4、PyAutoGUI入门:鼠标操作、键盘操作、屏幕截图与图像定位
好,咱们今天来聊聊PyAutoGUI。这个库,说白了就是让你的Python脚本能像人一样操作电脑。鼠标点点、键盘敲敲、截个图、找张图,它都能干。我刚开始做桌面应用测试那会儿,最头疼的就是重复性的UI操作。后来发现了PyAutoGUI,嗯,真香。
4.1 鼠标操作:移动、点击、拖拽
鼠标操作是自动化测试的基础。你想想看,测试一个桌面应用,第一步往往就是「把鼠标移到那个按钮上,然后点一下」。PyAutoGUI把这几个动作封装得特别简单。
4.1.1 获取屏幕尺寸与鼠标位置
在操作鼠标之前,我建议你先搞清楚屏幕有多大,鼠标当前在哪儿。这就像开车前先看看路况。
import pyautogui
# 获取屏幕尺寸
screen_width, screen_height = pyautogui.size()
print(f"屏幕尺寸:{screen_width} x {screen_height}")
# 获取当前鼠标位置
current_x, current_y = pyautogui.position()
print(f"鼠标当前位置:({current_x}, {current_y})")
我个人习惯在写脚本前,先跑一下这段代码,确认坐标范围。有一次我在1920x1080的屏幕上写的脚本,拿到1366x768的笔记本上一跑,鼠标直接飞到屏幕外面去了。嗯,这就是个坑。
4.1.2 鼠标移动
移动鼠标,用 moveTo() 和 moveRel() 两个函数。前者是移动到绝对坐标,后者是相对当前位置移动。
# 移动到绝对坐标 (100, 200)
pyautogui.moveTo(100, 200, duration=0.5)
# 相对移动:向右移动50像素,向下移动100像素
pyautogui.moveRel(50, 100, duration=0.3)
这里有个小细节:duration 参数控制移动速度。我建议你加上这个参数,尤其是调试阶段。为什么?因为鼠标「嗖」一下飞过去,你根本看不清它去了哪儿。设个0.5秒,看着它慢慢移过去,心里踏实。
4.1.3 鼠标点击
点击操作,PyAutoGUI提供了 click()、doubleClick()、rightClick() 等函数。
# 左键单击当前位置
pyautogui.click()
# 左键单击指定位置
pyautogui.click(x=200, y=300)
# 双击
pyautogui.doubleClick(x=200, y=300)
# 右键单击
pyautogui.rightClick(x=200, y=300)
我在项目中遇到过一个问题:某个按钮点击后,界面有0.2秒的延迟才响应。直接 click() 完就执行下一步,结果下一步操作落在了错误的位置上。后来我加了个 time.sleep(0.3),问题就解决了。别小看这零点几秒,有时候它就是成败的关键。
4.1.4 鼠标拖拽
拖拽操作,说白了就是「按住鼠标,移动,再松开」。PyAutoGUI用 drag() 和 dragTo() 来实现。
# 从当前位置拖拽到 (300, 400)
pyautogui.dragTo(300, 400, duration=0.5)
# 相对拖拽:向右拖100像素,向下拖50像素
pyautogui.drag(100, 50, duration=0.3)
注意:拖拽操作在有些应用里会失效。我曾经在测试一个CAD软件时,拖拽操作死活不生效。后来发现是那个软件用了自定义的鼠标事件处理。解决办法是改用 mouseDown() 和 mouseUp() 手动模拟拖拽过程。
# 手动模拟拖拽
pyautogui.mouseDown(button='left')
pyautogui.moveTo(400, 500, duration=0.5)
pyautogui.mouseUp(button='left')
4.2 键盘操作:输入与快捷键
键盘操作,PyAutoGUI同样支持得很全面。从简单的文本输入,到复杂的组合快捷键,都能搞定。
4.2.1 文本输入
用 typewrite() 函数可以模拟键盘输入文本。
# 输入文本
pyautogui.typewrite('Hello, World!')
# 带间隔的输入(模拟真人打字)
pyautogui.typewrite('Hello', interval=0.1)
我个人习惯在输入重要内容时加上 interval 参数。为什么?因为有些输入框有防抖机制,输入太快反而会漏字符。我踩过这个坑,输入一串密码,结果少了个字符,登录失败。后来加上0.05秒的间隔,再也没出过问题。
4.2.2 按键操作
单个按键,比如回车、退格、方向键,用 press() 函数。
# 按下回车键
pyautogui.press('enter')
# 按下退格键
pyautogui.press('backspace')
# 按下方向键
pyautogui.press('down')
pyautogui.press('up')
常用的按键名称有:'enter'、'tab'、'esc'、'space'、'backspace'、'delete'、'up'、'down'、'left'、'right' 等。
4.2.3 快捷键组合
快捷键,比如 Ctrl+C、Ctrl+V,用 hotkey() 函数。
# Ctrl+C 复制
pyautogui.hotkey('ctrl', 'c')
# Ctrl+V 粘贴
pyautogui.hotkey('ctrl', 'v')
# Alt+Tab 切换窗口
pyautogui.hotkey('alt', 'tab')
这里有个小技巧:hotkey() 会自动处理按键顺序和释放。你不需要手动去按顺序按下再松开,它全帮你搞定了。我曾经用 keyDown() 和 keyUp() 手动模拟快捷键,结果经常出现按键卡住的情况。后来全换成 hotkey(),省心多了。
4.3 屏幕截图与图像定位
这部分是PyAutoGUI的杀手锏。你想想看,如果只知道坐标,那脚本换个分辨率就废了。但如果你能「看图找位置」,那脚本的通用性就大大提升了。
4.3.1 屏幕截图
PyAutoGUI可以截取整个屏幕,也可以截取指定区域。
# 截取全屏
screenshot = pyautogui.screenshot()
screenshot.save('full_screen.png')
# 截取指定区域 (x, y, width, height)
region_screenshot = pyautogui.screenshot(region=(100, 100, 300, 200))
region_screenshot.save('region.png')
截图返回的是一个PIL的Image对象,你可以用PIL库对它做进一步处理,比如裁剪、缩放、颜色转换等。
4.3.2 图像定位
图像定位,说白了就是「给一张小图,在大屏幕上找到它的位置」。PyAutoGUI用 locateOnScreen() 来实现。
# 在屏幕上查找图片
location = pyautogui.locateOnScreen('button.png')
if location is not None:
print(f"找到图片,位置:{location}")
# 获取中心点坐标
center_x, center_y = pyautogui.center(location)
pyautogui.click(center_x, center_y)
else:
print("未找到图片")
提示:图像定位的准确度取决于图片的清晰度和屏幕的缩放比例。我建议你截取图片时,尽量截取特征明显的区域,比如按钮的图标部分,而不是纯色背景。另外,如果屏幕缩放不是100%,记得先调整缩放比例,否则定位会偏移。
4.3.3 图像定位的进阶用法
有时候屏幕上会有多个相同的图标,比如多个「确定」按钮。这时候可以用 locateAllOnScreen() 来找到所有匹配的位置。
# 查找所有匹配的图片
for pos in pyautogui.locateAllOnScreen('ok_button.png'):
print(f"找到一个:{pos}")
center = pyautogui.center(pos)
pyautogui.click(center)
还有一个常用的参数是 confidence,用于设置匹配的置信度。默认是1.0(完全匹配),但实际应用中,由于屏幕缩放、颜色偏差等原因,建议设低一点。
# 设置置信度为0.8
location = pyautogui.locateOnScreen('button.png', confidence=0.8)
注意:使用 confidence 参数需要安装 opencv-python 库。否则会报错。我曾经在部署脚本时忘了装这个依赖,结果脚本跑起来直接崩溃。嗯,这个坑我替你们踩过了。
4.4 实战小技巧
最后,分享几个我在实际项目中积累的小技巧。
- 失败重试机制:图像定位不是100%成功的。我建议加上重试逻辑,比如每隔0.5秒查一次,最多查10次。
- 日志记录:每次操作都记录一下日志,方便排查问题。比如「点击了坐标(100,200)」、「找到了图片button.png」。
- 异常处理:PyAutoGUI的操作可能会因为各种原因失败,比如窗口被遮挡、应用崩溃。建议用try-except包起来。
- 调试模式:在开发阶段,把
pyautogui.PAUSE设成0.5秒,这样每一步操作之间都有半秒间隔,方便观察。
import pyautogui
import time
# 调试模式:每一步操作间隔0.5秒
pyautogui.PAUSE = 0.5
# 失败重试:查找图片,最多重试10次
def find_image_with_retry(image_path, max_retries=10):
for i in range(max_retries):
location = pyautogui.locateOnScreen(image_path, confidence=0.8)
if location is not None:
return location
time.sleep(0.5)
return None
# 使用示例
location = find_image_with_retry('button.png')
if location:
center = pyautogui.center(location)
pyautogui.click(center)
print(f"成功点击按钮,位置:{center}")
else:
print("按钮未找到,请检查应用状态")
好了,PyAutoGUI的入门就讲到这里。鼠标、键盘、截图、图像定位,这四个功能组合起来,已经能覆盖大部分桌面应用的自动化测试场景了。下一章,咱们会深入聊聊如何用这些基础操作,搭建一个完整的测试框架。