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. 坐标尽量动态获取,不要硬编码固定坐标,提高脚本兼容性。
相关推荐
旖-旎9 小时前
QT系统篇(5)(下)
开发语言·c++·qt
摇滚侠10 小时前
方法 A 等方法 B 执行完再执行 叫同步调用还是异步调用 JS 默认是同步调用还是异步调用
开发语言·javascript·ecmascript
liulun10 小时前
C++ WinRT中的事件
开发语言·c++
whitelbwwww10 小时前
c++运行onnx模型
开发语言·c++
码来的小朋友10 小时前
手把手教你用 Python + PyQt5 做一个可视化图片切图工具
开发语言·python·microsoft
weixin1997010801610 小时前
[特殊字符]《京东订单API(jd.order.detail.get)对接ERP:企业认证+OAuth授权避坑指南》(附Python源码)
java·数据库·python
云烟成雨TD11 小时前
LangFlow 1.x 系列【3】入门案例
人工智能·python·agent
创世宇图11 小时前
【Python工程化实战】Python 服务的结构化日志体系:structlog + JSON 输出 + 日志分级策略
python·elk·structlog·结构化日志·可观测性
aaaameliaaa11 小时前
计算斐波那契数(递归、迭代)(1,1,2,3,5.....)
c语言·开发语言·笔记·算法·排序算法
m0_5474866611 小时前
《模式识别:使用MATLAB分析与实现》全套PPT课件
开发语言·matlab·模式识别