
文章目录
- 一、控件的操作
-
- [1.1 点击](#1.1 点击)
-
- [1.1.1 click_input()](#1.1.1 click_input())
- [1.1.2. right_click_input()](#1.1.2. right_click_input())
- [1.1.3 right_click_input()](#1.1.3 right_click_input())
- [二、 ⽂本](#二、 ⽂本)
-
-
- [2.1 texts()](#2.1 texts())
- [2.2 window_text()](#2.2 window_text())
-
- 三、⿏标操作
- 四、键盘操作
-
-
- [4.1 输⼊⽂本](#4.1 输⼊⽂本)
- [4.2 按键](#4.2 按键)
- [4.3 自动化测试场景示例:微信发消息](#4.3 自动化测试场景示例:微信发消息)
-
- 🚩总结
一、控件的操作
1.1 点击
1.1.1 click_input()
模拟鼠标左键单击操作
使⽤⽰例:
python
from pywinauto import Application
app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")
win = app.window("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").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")
win = app.window("visible")
win.right_click_input()
1.1.3 right_click_input()
模拟⿏标右键双击操作
使⽤⽰例:选中
python
from pywinauto import Application
app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")
win = app.window(title_re='.*Sublime Text.*')
win.wait("visible")
menu = win["应用程序"]
#双击菜单栏--达到窗口最大化目的
menu.double_click_input()
二、 ⽂本
2.1 texts()
⽤于获取窗⼝或控件中的所有⽂本内容,返回⼀个列表,其中每个元素是⼀个字符串,表⽰窗⼝或控
件中的某个⽂本⽚段
⽰例1:获取窗⼝的标题
python
from pywinauto import Application
app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")
win = app.window(title_re='.*Sublime Text.*')
win.wait("visible")
print(win.texts())
打印结果:

⽰例2:获取控件的标题
python
# ⽰例2:获取控件的标题
from pywinauto import Application
app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")
win = app.window(title_re='.*Sublime Text.*')
win.wait("visible")
file = win.child_window(title="File", control_type="MenuItem")
print(file.texts())
2.2 window_text()
⽤于获取窗⼝或控件的主⽂本内容,通常是指窗⼝的标题或主要显⽰的⽂本。它返回⼀个字符串。
python
from pywinauto import Application
app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")
win = app.window(title_re='.*Sublime Text.*')
win.wait("visible")
file = win.child_window(title="File", control_type="MenuItem")
# print(file.texts())
print(win.window_text())
三、⿏标操作
在使⽤pywinauto进⾏⾃动化测试时,我们通常会利⽤控件的点击⽅法来实现交互操作。这些⽅法不仅⽀持对控件的直接点击,还允许通过指定coords 参数来实现基于坐标的点击操作。
可以结合屏幕坐标系 和窗口边界来直观理解,示意图如下:
窗口的矩形 (L209, T230, R1430, B1217) 对应以下边界:
屏幕顶部(Y=0)
|
| 窗口左上角 ➜ (L=209, T=230)
| +-----------------------------+
| | 窗口内部可操作区域 |
| | (鼠标点击需在此范围内) |
| | |
| +-----------------------------+
| 窗口右下角 ➜ (R=1430, B=1217)
+----------------------------------------------------> 屏幕右侧(X增大方向)
(X=0,屏幕最左侧)
例如,当我们尝试通过win.double_click_input(coords=(1043, 300)) 来点击Sublime Text 窗⼝的最⼤化按钮时,虽然语法上没有问题,但这种⽅法可能⽆法完全满⾜我们的需求,尤其是在需要更精确或更灵活的⿏标交互时。
python
from pywinauto import Application
import time
# 启动Sublime Text
app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")
time.sleep(3) # 等待应用完全启动
# 定位窗口并等待可见
win = app.window(title_re=".*Sublime Text.*")
win.wait("visible", timeout=20)
# 打印窗口范围(确认有效区域)
print("窗口有效范围:", win.rectangle()) # 输出 (L209, T230, R1430, B1217)
# 修改坐标至窗口内的菜单栏位置(以"File"菜单为例,视觉反馈明显)
# X: 1043(在209-1430之间),Y: 300(在230-1217之间,对应菜单栏高度)
click_coords = (1043, 300)
# 提示即将执行操作
print(f"即将双击坐标:{click_coords}(窗口内有效区域)")
# 执行双击(点击"File"菜单,会弹出下拉菜单,效果明显)
win.double_click_input(coords=click_coords)
# 停留几秒,让用户看清效果
time.sleep(5)
⽰例:拖动滚动条
rectangle() :获取元素对应坐标,返回矩形尺⼨,具有top,left,right,bottom属性

mid_point():获取元素中间位置坐标,返回类型为元组,元组中两个整数分别是X、Y轴的值
mouse 模块常⻅操作:
python
from pywinauto import Application
# app = Application(backend=' uia ' ) .start ( "mspaint.exe")app = Application(backend='uia ' ).connect(process=8572)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)
python
from pywinauto import Application, mouse
import time
# 1. 启动Sublime(路径确认对的话不用改)
app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe") # 先换win32 backend试试
time.sleep(5) # 先等5秒,给足启动时间(比默认10秒更灵活)
# 2. 定位窗口:用"模糊匹配标题"(不管是3/4版本都能找到),延长超时到20秒
# title_re=".*Sublime Text.*" 表示"标题包含[Sublime Text]的所有窗口"
win = app.window(title_re=".*Sublime Text.*")
win.wait('visible', timeout=20) # 等20秒,确保窗口显示
# (可选)调试:打印找到的窗口实际标题,确认没找错
# print("实际找到的窗口标题:", win.text())
try:
while True:
# 计算窗口中间点(确保滚动作用在Sublime窗口上)
win_rect = win.rectangle()
mid = win_rect.mid_point()
# 向下滚动(wheel_dist=5,幅度小更易观察,比100合适)
mouse.scroll(coords=(mid.x, mid.y), wheel_dist=5)
time.sleep(3)
# 向上滚动
mouse.scroll(coords=(mid.x, mid.y), wheel_dist=-5)
time.sleep(3)
except KeyboardInterrupt:
print("程序已停止")
mouse 模块常⻅操作:
| 方法 | 功能描述 |
|---|---|
mouse.click(button='left', coords=(0, 0)) |
单击指定的坐标 |
mouse.scroll(coords=(0, 0), wheel_dist=1) |
滚动鼠标滚轮,wheel_dist表示滚动的距离,大于0是向上滚动,小于0是向下滑动。 |
mouse.double_click(button='left', 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)) |
释放鼠标按钮 |
⾃动化测试场景⽰例:抖⾳点赞
抖⾳客户端的定位某个空间层次太深,不好使用UISpy定位
python
from pywinauto import Application, mouse
import time
try:
# 连接到已运行的抖音进程(替换为实际PID)
app = Application(backend="uia").connect(process=14488)
win = app["抖音"]
win.wait("visible", timeout=20) # 等待窗口可见
win.set_focus() # 激活抖音窗口,确保操作生效
# 循环3次:双击点赞 + 滑动到下一个视频
for i in range(3):
print(f"正在执行第 {i+1} 次操作...")
# 获取窗口中心坐标(用于双击点赞和滚动)
mid = win.rectangle().mid_point()
# 1. 双击点赞(窗口中心区域,抖音双击屏幕可点赞)
mouse.double_click(coords=(mid.x, mid.y))
print("已执行双击点赞")
time.sleep(1) # 等待点赞动画完成
# 2. 滑动到下一个视频(鼠标滚轮向下滚动,wheel_dist正数为向下)
mouse.scroll(coords=(mid.x, mid.y), wheel_dist=500)
print("已滑动到下一个视频")
time.sleep(2) # 等待视频加载完成
print("所有操作执行完毕!")
except Exception as e:
print(f"操作过程中出现错误:{e}")
四、键盘操作
在自动化测试中,pywinauto提供了强大的键盘操作功能,其中keyboard模块是核心组件之一。keyboard.send_keys()是一个通用的键盘输入方法,它可以直接将按键序列发送到当前具有焦点的窗口。然而,在实际的自动化场景中,我们通常需要针对特定的控件(如文本框、按钮等)进行精确的输入操作,而不是依赖于窗口的焦点状态。
为了满足这种需求,pywinauto对键盘输入功能进行了进一步的封装,引入了type_keys方法。type_keys是控件对象(例如Edit控件或Button控件)的专属方法,可以直接作用于指定的控件,确保输入内容精准无误。这种方法避免了因焦点切换导致的输入错误,特别适合在复杂的用户界面中进行自动化操作
语法:
python
type_keys(
keys,#要输入的键序列,可以是普通字符、特殊键或组合键
pause = None,#每次按键后的延迟时间(秒)
with_spaces = False,#如果为True,则会在输入的字符串中保留空格。
with_newlines = False,#如果为True,则会在输入的字符串中保留换行符。
向当前焦点窗⼝⾃动键⼊键或发送⽂本。
4.1 输⼊⽂本
直接输入文本(支持Unicode 字符):
python
from pywinauto import Application
app = Application(backend='uia ' ).connect(process=32936)win = app.window(title_re=' .*Sublime Text.* ')
win.wait( "visible")#输入文本内容
win.123("------type_keys------")#保留换行符
win.type_keys ( "------type_keys------\n",with_newlines=True)#保留空格
win.type_keys( " -----type keys----",with_spaces=True)#延迟输入,避免输入过快导致内容不完整
win.type_keys("一二三四五六七" , with_spaces=True)
4.2 按键
使用{VK_CoDE}格式表示虚拟键码,例如:
| 按键 | 代码 |
|---|---|
| Enter | {ENTER} |
| Tab | {TAB} |
| Backspace | {BACKSPACE} |
| Esc | {ESC} |
| 方向键 | {UP}, {DOWN}, {LEFT}, {RIGHT} |
| F1-F9 | {F1} - {F9} |
| Shift | + |
| Ctrl | ^ |
| Alt | % |
python
from pywinauto import Application
app = Application(backend='uia ' ).connect(process=32936)win = app.window(title_re=' .*Sublime Text.* ')
win.wait( "visible")#发送文本和回车
win.type_keys( "Hello world{ENTER} " , with_spaces=True)win.type_keys( "Hello bit" , with_spaces=True)
指定重复次数
- 指定重复次数
可以为特殊键指定重复计数。{ENTER 2}表示按两次Enter键
代码块
python
# 发送文本和回车
win.type_keys("Hello World{ENTER 2}", with_spaces=True)
win.type_keys("Hello bit", with_spaces=True)
- 转义特殊字符
使用{}包裹特殊字符(如{+},{%},{^})以避免被识别为修饰符
代码块
python
win.type_keys("1+2=3") # 错误: `+` 会被识别为 Shift
win.type_keys("1{+}2=3") # 正确
4.3 自动化测试场景示例:微信发消息
1)⽤例设计
GUI⾃动化⽤例的设计主要基于UI(界⾯)测试和界⾯展⽰的功能来进⾏⽤例的设计。
python
app = Application(backend="uia").connect(process=12275)
win = app.window(title="文件传输助手", handle=233444)
win.wait("visible")
# 找到输入控件
edit = win.child_window(title="输入", control_type="Edit")
edit.wait("ready")
# 点击消息框
edit.click_input()
# 输入文本信息
edit.type_keys("你在用Pywinauto吗")
# 点击发送
win.child_window(title="发送(S)", control_type="Button").click_input()
# 检查发送结果
win.child_window(title="猫", control_type="ListItem").texts()

2)代码实现
以⽤例"验证⽤⼾输⼊⽂本后点击发送按钮,消息是否能成功发送并显⽰在聊天窗⼝中"为例
python
# 连接到微信进程(请替换为实际的process值)
app = Application(backend="uia").connect(process=11111)
# 定位文件传输助手窗口(确保title正确)
win = app.window(title="文件传输助手", handle=233444)
win.wait("visible")
# 找到输入框控件
edit = win.child_window(title="输入", control_type="Edit")
edit.wait("ready")
edit.click_input() # 点击输入框激活
# 准备一组有趣的消息
funny_messages = [
"报告传输助手!今天发现一只会打字的猫🐱 它说想加你好友",
"刚学会一个魔术------你看这条消息,3秒后会变成彩虹色🌈(骗你的哈哈)",
"警告⚠️ 你的聊天框即将被可爱能量淹没------接收完毕!",
"猜猜我今天吃了什么?答案是:你打不开的神秘外卖🥡",
"系统提示:这条消息需要你笑一下才能显示完整😊 好了现在你可以看了~"
]
# 循环发送消息,增加互动感
for i, msg in enumerate(funny_messages):
edit.type_keys(msg) # 输入消息
time.sleep(1) # 假装在思考
# 点击发送按钮
win.child_window(title="发送(S)", control_type="Button").click_input()
print(f"已发送第{i + 1}条趣闻")
time.sleep(2) # 模拟聊天间隔
# 最后来个互动提问
edit.type_keys("你觉得哪条最有趣?悄悄告诉我~")
win.child_window(title="发送(S)", control_type="Button").click_input()
print("所有消息发送完毕,等待回复中...")
🚩总结
