乐于分享
好东西不私藏

PC端自动化测试实战教程-17-pywinauto获取应用程序窗口控件的相关属性 - 上篇(详细教程)

PC端自动化测试实战教程-17-pywinauto获取应用程序窗口控件的相关属性 - 上篇(详细教程)

就是那个揭开它的人。

真相只有一个,而我,

美好的六月再见
七月你好

关注北京宏哥,不迷路,提前解锁更多干货

这是我的第493篇原创

作者:北京宏哥


感谢您抽出

.

.

阅读本文

哈喽!很高兴和大家2026年第 9 次见面
好久没有更新文章了,上次发文章还是在端午节左右,一方面原因是最近太忙了,另一方面是可怜的阅读数和粉丝增长数,让我实在没有更新的动力

1.简介

应用程序的窗口的控件包含诸多属性,宏哥不可能一一介绍,这里宏哥就将我们日常学习和工作中经常遇到的属性进行讲解和介绍一下,以供小伙伴或者童鞋们学习和参考。

2.窗口控件类型分类

这里宏哥使用pywinauto库启动记事本应用,通过窗口标题选择窗口,并列出所有控件,包括Edit编辑框、ScrollBar滚动条、StatusBar状态栏等。其实之前宏哥已经在控制台打印窗口控件结构树从这里就可以看到窗口控件的各种类型。这里宏哥就再次打印一下,然后通过表格的形式给小伙伴或者童鞋们分类展示一下,以便学习记忆。

2.1参考代码

# -*- coding:utf-8 -*-# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。'''Created on 2026-07-24@author: 北京-宏哥北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)Project: PC端自动化测试实战教程-17-pywinauto获取应用程序窗口控件的相关属性(详细教程)'''# 3.导入模块from pywinauto import Applicationimport timeapp = Application('uia').start("notepad.exe")time.sleep(3)app = Application('uia').connect(class_name="Notepad")win = app['无标题 - Notepad']win.print_ctrl_ids()

2.2运行代码

1.运行代码,右键Run'Test',就可以看到控制台输出(由于控制台的展示有限,宏哥将其内容复制出来),如下图所示:

D:\Python\python.exe D:/Demo/demo.pyD:\Python\lib\site-packages\pywinauto\application.py:1076: RuntimeWarning: Application is not loaded correctly (WaitForInputIdle failed)  warnings.warn('Application is not loaded correctly (WaitForInputIdle failed)', RuntimeWarning)Control Identifiers:Dialog - '无标题 - Notepad'    (L40, T40, R751, B625)['无标题 - NotepadDialog', 'Dialog', '无标题 - Notepad', 'Dialog0', 'Dialog1']child_window(title="无标题 - Notepad", control_type="Window")   |    | Pane - ''    (L48, T133, R743, B577)   | ['Pane', '无标题Pane', 'Pane0', 'Pane1', '无标题Pane0', '无标题Pane1']   |    |    |    | Document - ''    (L48, T133, R743, B577)   |    | ['无标题Document', 'Document']   |    | Pane - ''    (L98, T52, R457, B92)   | ['Pane2', '无标题Pane2']   |    |    |    | Pane - ''    (L98, T52, R457, B92)   |    | ['Pane3', '无标题Pane3']   |    |    |    |    |    | TabControl - ''    (L98, T52, R457, B92)   |    |    | ['无标题TabControl', 'TabControl添加新标签页', 'TabControl']   |    |    | child_window(auto_id="Tabs", control_type="Tab")   |    |    |    |    |    |    |    | ListBox - ''    (L100, T52, R410, B92)   |    |    |    | ['无标题ListBox', 'ListBox']   |    |    |    | child_window(auto_id="TabListView", control_type="List")   |    |    |    |    |    |    |    |    |    | TabItem - '无标题. 未修改。'    (L103, T52, R410, B92)   |    |    |    |    | ['TabItem', '无标题. 未修改。TabItem', '无标题. 未修改。']   |    |    |    |    | child_window(title="无标题. 未修改。", control_type="TabItem")   |    |    |    |    |    |    |    |    |    |    |    | Static - '无标题'    (L119, T62, R164, B81)   |    |    |    |    |    | ['无标题', 'Static', '无标题Static', 'Static0', 'Static1']   |    |    |    |    |    | child_window(title="无标题", control_type="Text")   |    |    |    |    |    |    |    |    |    |    |    | Button - '关闭标签页'    (L359, T57, R399, B87)   |    |    |    |    |    | ['关闭标签页', 'Button', '关闭标签页Button', 'Button0', 'Button1']   |    |    |    |    |    | child_window(title="关闭标签页", auto_id="CloseButton", control_type="Button")   |    |    |    |    |    |    |    | Button - '添加新标签页'    (L414, T58, R454, B88)   |    |    |    | ['添加新标签页', 'Button2', '添加新标签页Button']   |    |    |    | child_window(title="添加新标签页", auto_id="AddButton", control_type="Button")   |    |    |    |    |    | Pane - '记事本自动保存进度。下次打开记事本时,你的所有内容都将可用。'    (L0, T0, R0, B0)   |    |    | ['记事本自动保存进度。下次打开记事本时,你的所有内容都将可用。Pane', 'Pane4', '记事本自动保存进度。下次打开记事本时,你的所有内容都将可用。']   |    |    | child_window(title="记事本自动保存进度。下次打开记事本时,你的所有内容都将可用。", auto_id="TeachingTip", control_type="Pane")   |    | Pane - ''    (L48, T92, R743, B133)   | ['Pane5', '无标题Pane4']   |    |    |    | Pane - ''    (L48, T92, R743, B133)   |    | ['Pane6', '无标题Pane5']   |    |    |    |    |    | Menu - ''    (L48, T92, R258, B132)   |    |    | ['Menu', '无标题Menu', 'Menu0', 'Menu1']   |    |    | child_window(auto_id="MenuBar", control_type="MenuBar")   |    |    |    |    |    |    |    | MenuItem - '文件'    (L53, T92, R113, B132)   |    |    |    | ['文件', '文件MenuItem', 'MenuItem', 'MenuItem0', 'MenuItem1']   |    |    |    | child_window(title="文件", auto_id="File", control_type="MenuItem")   |    |    |    |    |    |    |    | MenuItem - '编辑'    (L123, T92, R183, B132)   |    |    |    | ['编辑MenuItem', '编辑', 'MenuItem2']   |    |    |    | child_window(title="编辑", auto_id="Edit", control_type="MenuItem")   |    |    |    |    |    |    |    | MenuItem - '查看'    (L193, T92, R253, B132)   |    |    |    | ['查看MenuItem', 'MenuItem3', '查看']   |    |    |    | child_window(title="查看", auto_id="View", control_type="MenuItem")   |    |    |    |    |    | Button - '标题'    (L245, T92, R316, B132)   |    |    | ['标题', '标题Button', 'Button3']   |    |    | child_window(title="标题", control_type="Button")   |    |    |    |    |    | Button - '列表'    (L316, T92, R386, B132)   |    |    | ['列表Button', '列表', 'Button4']   |    |    | child_window(title="列表", control_type="Button")   |    |    |    |    |    | Button - '加粗(Ctrl+B)'    (L386, T92, R426, B132)   |    |    | ['加粗(Ctrl+B)Button', 'Button5', '加粗(Ctrl+B)']   |    |    | child_window(title="加粗(Ctrl+B)", control_type="Button")   |    |    |    |    |    | Button - '斜体(Ctrl+I)'    (L426, T92, R466, B132)   |    |    | ['斜体(Ctrl+I)Button', '斜体(Ctrl+I)', 'Button6']   |    |    | child_window(title="斜体(Ctrl+I)", control_type="Button")   |    |    |    |    |    | Button - '链接(Ctrl+K)'    (L466, T92, R506, B132)   |    |    | ['链接(Ctrl+K)', 'Button7', '链接(Ctrl+K)Button']   |    |    | child_window(title="链接(Ctrl+K)", control_type="Button")   |    |    |    |    |    | Button - '清除格式设置(Ctrl+空格)'    (L506, T92, R546, B132)   |    |    | ['Button8', '清除格式设置(Ctrl+空格)Button', '清除格式设置(Ctrl+空格)']   |    |    | child_window(title="清除格式设置(Ctrl+空格)", control_type="Button")   |    |    |    |    |    | Button - '设置'    (L695, T92, R733, B132)   |    |    | ['Button9', '设置', '设置Button']   |    |    | child_window(title="设置", auto_id="SettingsButton", control_type="Button")   |    |    |    |    |    | Dialog - ''    (L0, T0, R0, B0)   |    |    | ['Dialog2']   |    |    | child_window(auto_id="PrivacyTeachingTip", control_type="Window")   |    |    |    |    |    | Dialog - ''    (L0, T0, R0, B0)   |    |    | ['Dialog3']   |    |    | child_window(auto_id="CowriterTeachingTip", control_type="Window")   |    | Pane - ''    (L48, T577, R743, B617)   | ['Pane7', '  行 1,列 1Pane', '  行 1,列 1Pane0', '  行 1,列 1Pane1']   |    |    |    | Pane - ''    (L48, T577, R743, B617)   |    | ['Pane8', '  行 1,列 1Pane2']   |    |    |    |    |    | Static - '  行 1,列 1'    (L68, T587, R147, B607)   |    |    | ['Static2', '  行 1,列 1', '  行 1,列 1Static']   |    |    | child_window(title="  行 1,列 1", auto_id="ContentTextBlock", control_type="Text")   |    |    |    |    |    | Static - '0 个字符'    (L179, T587, R237, B607)   |    |    | ['Static3', '0 个字符', '0 个字符Static']   |    |    | child_window(title="0 个字符", auto_id="ContentTextBlock", control_type="Text")   |    |    |    |    |    | Static - '纯文本'    (L293, T577, R353, B617)   |    |    | ['纯文本Static', 'Static4', '纯文本']   |    |    | child_window(title="纯文本", auto_id="ContentTextBlock", control_type="Text")   |    |    |    |    |    | Static - ' 100%'    (L423, T587, R464, B607)   |    |    | ['Static5', ' 100%Static', ' 100%']   |    |    | child_window(title=" 100%", auto_id="ContentTextBlock", control_type="Text")   |    |    |    |    |    | Static - ' Windows (CRLF)'    (L499, T587, R599, B607)   |    |    | [' Windows (CRLF)', ' Windows (CRLF)Static', 'Static6']   |    |    | child_window(title=" Windows (CRLF)", auto_id="ContentTextBlock", control_type="Text")   |    |    |    |    |    | Static - ' UTF-8'    (L622, T587, R666, B607)   |    |    | ['Static7', ' UTF-8Static', ' UTF-8']   |    |    | child_window(title=" UTF-8", auto_id="ContentTextBlock", control_type="Text")   |    | TitleBar - ''    (L0, T0, R0, B0)   | ['TitleBar']   |    |    |    | Menu - '系统'    (L49, T49, R77, B77)   |    | ['系统', 'Menu2', '系统Menu', '系统0', '系统1']   |    | child_window(title="系统", auto_id="MenuBar", control_type="MenuBar")   |    |    |    |    |    | MenuItem - '系统'    (L49, T49, R77, B77)   |    |    | ['系统2', '系统MenuItem', 'MenuItem4']   |    |    | child_window(title="系统", control_type="MenuItem")   |    |    |    | Button - '最小化'    (L565, T41, R625, B78)   |    | ['最小化', '最小化Button', 'Button10']   |    | child_window(title="最小化", control_type="Button")   |    |    |    | Button - '最大化'    (L625, T41, R684, B78)   |    | ['最大化', '最大化Button', 'Button11']   |    | child_window(title="最大化", control_type="Button")   |    |    |    | Button - '关闭'    (L684, T41, R744, B78)   |    | ['关闭', 'Button12', '关闭Button']   |    | child_window(title="关闭", control_type="Button")Process finished with exit code 0

2.3窗口控件类型

将控制台的窗口控件类型进行整理分类,如下表所示:

控件类型
名称
StatusBar
状态栏
Button
按钮
RadioButton
单选框
ComboBox
组合框
Edit
编辑栏
ListBox
列表框
PopupMenu
弹出菜单
Toolbar
工具栏
Tree View
树状视图
MenuItem
菜单项
Static
静态内容
CheckBox
复选框
GroupBox
组框
Dialog
对话框(窗口)
Header
头部内容
ListView
列表显示控件
TabControl
选项卡控件
ToolTips
工具提示
Menu
菜单
Pane
窗格

3.窗口控件的相关属性

窗口控件的类型我们了解后,就进入今天的主题:窗口控件的相关属性 如何获取,下边来跟随宏哥一步一步来学习。宏哥这里还是以记事本窗口为例,如何使用pywinauto库在Python中操作Windows应用程序,如记事本,包括获取控件类型、使用dir查看支持的方法、获取控件文本内容、子元素、类名以及属性。主要涉及的方法有wrapper_object()、texts()、children()和get_properties()。为了方便学习和记忆,宏哥也整理成表格的形式。如下表所示:

方法
名称
wrapper_object()
获取控件类型
print(dir(a.wrapper_object()))
获取该控件支持的方法
texts
获取控件的文本内容
children
获取控件的子元素
class_name
获取控件类名
get_properties
以字典形式返回控件的属性

3.1查看控件类型

从上边的表格中,我们知道使用wrapper_object()方法获取控件的类型。

3.1.1代码设计

3.1.2参考代码
# -*- coding:utf-8 -*-# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。'''Created on 2026-07-24@author: 北京-宏哥北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)Project: PC端自动化测试实战教程-17-pywinauto获取应用程序窗口控件的相关属性 - 上篇(详细教程)'''# 3.导入模块from pywinauto import Applicationimport timeapp = Application('uia').start("notepad.exe")time.sleep(3)app = Application('uia').connect(class_name="Notepad")win = app['无标题 - Notepad']# 查看窗口上所有的控件# win.print_control_identifiers()# 选择菜单menu = win["应用程序Menu"]# print(menu.print_control_identifiers())# 选择菜单项:文件file = menu.child_window(title="文件")# 查看控件类型: wrapper_object()print(win.wrapper_object())print(menu.wrapper_object())print(file.wrapper_object())

3.1.3运行代码

1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的动作(启动记事本)。如下图所示:

3.2查看控件支持的方法

从上边的表格中,我们知道使用print(dir(a.wrapper_object()))方法获取控件支持的方法。

3.2.1代码设计

3.2.2参考代码

# -*- coding:utf-8 -*-# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。'''Created on 2026-07-24@author: 北京-宏哥北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)Project: PC端自动化测试实战教程-17-pywinauto获取应用程序窗口控件的相关属性 - 上篇(详细教程)'''# 3.导入模块from pywinauto import Applicationimport timeapp = Application('uia').start("notepad.exe")time.sleep(3)app = Application('uia').connect(class_name="Notepad")win = app['无标题 - Notepad']# 查看窗口上所有的控件# win.print_control_identifiers()# 选择菜单menu = win["应用程序Menu"]# print(menu.print_control_identifiers())# 选择菜单项:文件file = menu.child_window(title="文件")# 查看控件类型: wrapper_object()# print(win.wrapper_object())# print(menu.wrapper_object())# print(file.wrapper_object())# dir: 查看对象所支持的方法print(dir(win.wrapper_object()))

3.2.3运行代码

1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的动作(启动记事本)。如下图所示:

3.3获取控件文本

1.从上边的表格中,我们知道使用texts()方法获取控件的文本。如果控件包含多行文本,可以使用texts()方法获取所有行的文本。

3.3.1代码设计

3.3.2参考代码

# -*- coding:utf-8 -*-# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。'''Created on 2026-07-24@author: 北京-宏哥北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)Project: PC端自动化测试实战教程-17-pywinauto获取应用程序窗口控件的相关属性 - 上篇(详细教程)'''# 3.导入模块from pywinauto import Applicationimport timeapp = Application('uia').start("notepad.exe")time.sleep(3)app = Application('uia').connect(class_name="Notepad")win = app['无标题 - Notepad']# 查看窗口上所有的控件# win.print_control_identifiers()# 选择菜单menu = win["应用程序Menu"]# print(menu.print_control_identifiers())# 选择菜单项:文件file = menu.child_window(title="文件")# 查看控件类型: wrapper_object()# print(win.wrapper_object())# print(menu.wrapper_object())# print(file.wrapper_object())# dir: 查看对象所支持的方法# print(dir(win.wrapper_object()))# 控件的文本内容获取:textsprint(file.texts())

3.3.3运行代码

1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的动作(启动记事本)。如下图所示:

2.使用window_text()方法获取控件的文本内容。这个一般用于处理单行文本的控件,一般为了省事直接就使用上边的方法了,单行和多行的都可以处理。所以这一种方法不常见用的很少,但是它也可以获取到控件的文本内容。

3.1.4代码设计

3.1.5参考代码

# -*- coding:utf-8 -*-# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。'''Created on 2026-07-24@author: 北京-宏哥北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)Project: PC端自动化测试实战教程-17-pywinauto获取应用程序窗口控件的相关属性 - 上篇(详细教程)'''# 3.导入模块from pywinauto import Applicationimport timeapp = Application('uia').start("notepad.exe")time.sleep(3)app = Application('uia').connect(class_name="Notepad")win = app['无标题 - Notepad']# 查看窗口上所有的控件# win.print_control_identifiers()# 选择菜单menu = win["应用程序Menu"]# print(menu.print_control_identifiers())# 选择菜单项:文件file = menu.child_window(title="文件")# 查看控件类型: wrapper_object()# print(win.wrapper_object())# print(menu.wrapper_object())# print(file.wrapper_object())# dir: 查看对象所支持的方法# print(dir(win.wrapper_object()))# 控件的文本内容获取:texts# print(file.texts())print(file.window_text())

3.1.6运行代码

1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的动作(启动记事本)。如下图所示:

4.小结

今天主要讲解和分享了pywinauto获取应用程序窗口控件的相关属性的几种方法函数,比较简单容易。直接调用即可。好了,今天时间也不早了,宏哥就讲解和分享到这里,感谢您耐心的阅读,希望对您有所帮助。

END

因工作繁忙,暂时做不到日更

每周一、周五早9:00左右准时更新(特殊情况例外

如果你喜欢我的文章,记得点赞+关注

更多干货,与你分享

END
每天学习一点点,今后必成大大神
往期推荐:

Appium自动化系列,耗时80天打造的从搭建环境到实际应用精品教程测试

Python接口自动化测试教程,熬夜87天整理出这一份上万字的超全学习指南

Python+Selenium自动化系列,通宵700天从无到有搭建一个自动化测试框架

Java+Selenium自动化系列,仿照Python趁热打铁呕心沥血317天搭建价值好几K的自动化测试框架

Jmeter工具从基础->进阶->高级,费时2年多整理出这一份全网超详细的入门到精通教程

Fiddler工具从基础->进阶->高级,费时100多天吐血整理出这一份全网超详细的入门到精通教程

Pycharm工具基础使用教程

Charles工具基础使用教程

如果你不想一个人野蛮生长,找不到系统的资料,问题得不到帮助,坚持几天便心生放弃的话,可以点击下方【阅读原文】加入我们的QQ群:339806057,大家可以一起讨论交流,里面会有各种软件测试资料和技术交流。

点击下方“阅读原文”,进软件测试学习群...
↓↓↓

END

右下角,您点赞和推荐

宏哥工资涨2毛

关注公众号,阅读更多技术干货👇

关注不迷路~ 各种福利、资源定期分享

🧐 点击「推荐,给宏哥加个鸡腿吧👇