6:控件操作与鼠标模拟

前面我们学习了 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 总结

  1. 优先使用控件操作click_input 系列,稳定、不受窗口位置影响,适合标准 Windows 软件。
  2. 特殊场景用鼠标模块 :自定义 UI、游戏、无法识别控件时,用 mouse 坐标操作。
  3. 文本获取:window_text() 用于拿标题做断言,texts() 用于获取全部文本。
  4. 坐标尽量动态获取,不要硬编码固定坐标,提高脚本兼容性。
相关推荐
霍霍的袁7 小时前
【C++初阶】缺省参数(默认参数)详细讲解
开发语言·c++·算法
I Promise347 小时前
多传感器融合&模型后处理C++工程师面试参考回答
开发语言·c++·面试
hef2887 小时前
SQL和Python怎么选?数据分析工具实战指南
python·sql·数据分析
徐安安ye7 小时前
FlashAttention长程依赖建模:局部+全局的Hybrid Spiral结构设计
python·深度学习·机器学习
2501_932750267 小时前
Java反射机制基础入门
java·开发语言
IT策士7 小时前
Django 从 0 到 1 打造完整电商平台:商品排序与浏览量统计
后端·python·django
霍霍的袁8 小时前
【C++初阶】函数重载详细讲解
开发语言·c++·算法
threelab8 小时前
Three.js 黑洞引力效果着色器 | 三维可视化 / AI 提示词
开发语言·javascript·着色器
godspeed_lucip8 小时前
LLM和Agent——专题3: Agentic Workflow 入门(4)
人工智能·python
godspeed_lucip8 小时前
LLM和Agent——专题3: Agentic Workflow 入门(2)
网络·人工智能·python