前面我们学习了 Pywinauto 环境搭建、窗口定位、等待机制,今天进入最核心的实战操作环节 。GUI 自动化最终目的就是模拟人操作软件,主要分为控件直接操作 和底层鼠标坐标操作两大类。本篇详细讲解点击、文本获取、鼠标模块使用,全部附带可直接运行的完整代码。
1 控件的操作
控件就是窗口内的按钮、输入框、菜单、文本框等可交互元素,Pywinauto 内置了一套直接操作控件的方法,不依赖屏幕坐标,稳定性最高,优先推荐使用。
1.1 点击操作
1.1.1 click_input () 模拟鼠标左键单击
最常用的点击方式,用于点击按钮、菜单、功能选项。
python
from pywinauto import Application
# 连接已打开的Sublime Text
app = Application(backend='uia').connect(process=8732)
win = app.window(title_re='.*Sublime Text.*')
win.wait("visible")
# 点击最大化按钮
win.child_window(title="最大化", control_type="Button").click_input()
1.1.2 right_click_input () 模拟鼠标右键单击
用于弹出右键菜单、右键功能操作。
python
from pywinauto import Application
app = Application(backend='uia').connect(process=8732)
win = app.window(title_re='.*Sublime Text.*')
win.wait("visible")
# 右键点击整个窗口
win.right_click_input()
1.1.3 double_click_input () 模拟鼠标左键双击
常用于双击打开、双击最大化、快速触发功能。
python
from pywinauto import Application
app = Application(backend='uia').connect(process=8732)
win = app.window(title_re='.*Sublime Text.*')
win.wait("visible")
menu = win['应用程序']
# 双击菜单栏
menu.double_click_input()
1.2 文本获取操作
自动化测试中经常需要获取窗口、按钮、菜单的文字,用于判断、断言、日志打印。提供两个核心方法。
1.2.1 texts () 获取所有文本片段
返回列表,包含当前窗口 / 控件下所有子文本内容。 示例 1:获取窗口所有文本
python
from pywinauto import Application
app = Application(backend='uia').connect(process=2392)
win = app.window(title_re='.*Sublime Text.*')
win.wait("visible")
print(win.texts())
示例 2:获取控件文本
python
from pywinauto import Application
app = Application(backend='uia').connect(process=2392)
win = app.window(title_re='.*Sublime Text.*')
win.wait("visible")
file = win.child_window(title="File", control_type="MenuItem")
print(file.texts())
1.2.2 window_text () 获取主文本
返回字符串,只获取控件 / 窗口的主标题,适合做断言。 示例 1:获取窗口标题
python
from pywinauto import Application
app = Application(backend='uia').connect(process=2392)
win = app.window(title_re='.*Sublime Text.*')
win.wait("visible")
print(win.window_text())
示例 2:获取控件标题
python
from pywinauto import Application
app = Application(backend='uia').connect(process=2392)
win = app.window(title_re='.*Sublime Text.*')
win.wait("visible")
file = win.child_window(title="File", control_type="MenuItem")
print(file.window_text())
2 鼠标操作(独立 mouse 模块)
上面的控件操作依赖 UI 控件识别,但遇到自定义渲染软件、游戏、无标准控件界面时无法使用,这时就要用底层鼠标模块,直接操作屏幕坐标。
2.1 基础坐标点击
可以给点击方法传入屏幕坐标实现点击。
python
from pywinauto import Application
from pywinauto import mouse
app = Application(backend='uia').connect(process=32936)
win = app.window(title_re='.*Sublime Text.*')
win.wait("visible")
# 固定坐标点击最大化按钮
mouse.click(coords=(1043,130))
控件方法也支持传入坐标:
python
win.double_click_input(coords=(1043,130))
2.2 动态获取坐标:rectangle () 与 mid_point ()
不建议写死坐标,窗口移动后会失效,推荐动态获取:
rectangle():获取控件矩形区域,包含上下左右坐标mid_point():获取控件中心点坐标
示例:画图软件滚动条滑动
python
from pywinauto import Application
from pywinauto import mouse
app = Application(backend='uia').connect(process=28372)
win = app.window(title="无标题 - 画图")
win.wait('visible')
# 定位垂直滚动条
right_ScrollBar = win.child_window(title="垂直滚动条",
auto_id="NonClientVerticalScrollBar", control_type="ScrollBar")
right_ScrollBar.wait('visible')
# 获取滚动条中心点
mid = right_ScrollBar.rectangle().mid_point()
# 滚轮滚动,正数向上,负数向下
mouse.scroll(coords=(mid.x,mid.y),wheel_dist=500)
2.3 mouse 模块常用方法汇总
| 方法 | 功能描述 |
|---|---|
| mouse.click(button='left', coords=(0, 0)) | 单击指定坐标 |
| mouse.scroll(coords=(0, 0), wheel_dist=1) | 滚动鼠标滚轮 |
| mouse.double_click(coords=(0, 0)) | 双击指定坐标 |
| mouse.right_click(coords=(0, 0)) | 右键单击 |
| mouse.move(coords=(0, 0)) | 移动鼠标 |
| mouse.wheel_click(coords=(0, 0)) | 鼠标中键单击 |
| mouse.press(button='left', coords=(0, 0)) | 按下鼠标按键 |
| mouse.release(button='left', coords=(0, 0)) | 释放鼠标按键 |
3 实战案例:抖音自动点赞 + 切换视频
综合使用鼠标双击、滚动实现短视频批量点赞,是非常典型的坐标自动化场景。
python
import time
import pywinauto
from pywinauto import mouse
#1:连接抖音
app=pywinauto.Application(backend="uia").connect(process=10440)
win=app.window(title="抖音")
win.wait("visible")
# # 打印所有控件
# print(app.process)
# #win.print_control_identifiers()
#
# #2:找到子控件
# like_text = win.child_window(title="13.5万", control_type="Text")
# like_text.wait("visible")
# #like_text.print_control_identifiers()
#
#
# #3:打印父亲所有控件
# parent_group=like_text.parent()
# children = parent_group.children()
# for idx, child in enumerate(children):
# print(f"[{idx}] {child.element_info.name} | Type: {child.element_info.control_type} | Class: {child.class_name()} | Rect: {child.rectangle()}")
# #
# #
# #4:获取所有子控件,第一个是Image
# like_icon=parent_group.children()[0]
# print("找到图标:", like_icon.element_info.control_type)
# like_icon.click_input()
# like_icon.click_input()
# time.sleep(3)
#
# #5:下拉视频
# point=win.rectangle().mid_point()
# mouse.scroll(coords=(point.x,point.y),wheel_dist=-50)
#通过双击视频点赞👍
for i in range(0,3):
point=win.rectangle().mid_point()
time.sleep(1)
win.double_click_input(coords=(point.x,point.y))
time.sleep(1)
mouse.scroll(coords=(point.x,point.y),wheel_dist=-50)
print(i)
4 总结
- 优先使用控件操作 :
click_input系列,稳定、不受窗口位置影响,适合标准 Windows 软件。 - 特殊场景用鼠标模块 :自定义 UI、游戏、无法识别控件时,用
mouse坐标操作。 - 文本获取:
window_text()用于拿标题做断言,texts()用于获取全部文本。 - 坐标尽量动态获取,不要硬编码固定坐标,提高脚本兼容性。