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

曾许人间第一流。
须知少日拏云志,

关注北京宏哥,不迷路,提前解锁更多干货
这是我的第494篇原创
作者:北京宏哥
☆☆☆☆☆
感谢您抽出

.

.

阅读本文


1.简介
上一篇文章中,宏哥由于时间的关系和其它一些不可控的因素,只介绍和讲解了部分获取应用程序窗口控件的相关属性的方法,这一篇宏哥就将剩下的一些常用的方法介绍和讲解。希望对各位小伙伴或者童鞋们有所帮助和参考。
2.窗口控件类型分类
这里宏哥使用pywinauto库启动记事本应用,通过窗口标题选择窗口,并列出所有控件,包括Edit编辑框、ScrollBar滚动条、StatusBar状态栏等。其实之前宏哥已经在控制台打印窗口控件结构树从这里就可以看到窗口控件的各种类型。这里宏哥就再次打印一下,然后通过表格的形式给小伙伴或者童鞋们分类展示一下,以便学习记忆。
2.1参考代码
# -*- coding:utf-8 -*-# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。'''Created on 2026-10-16@author: 北京-宏哥北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)Project: PC端自动化测试实战教程-18-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 02.3窗口控件类型
将控制台的窗口控件类型进行整理分类,如下表所示:
3.窗口控件的相关属性
窗口控件的类型我们了解后,就进入今天的主题:窗口控件的相关属性 如何获取,下边来跟随宏哥一步一步来学习。宏哥这里还是以记事本窗口为例,如何使用pywinauto库在Python中操作Windows应用程序,如记事本,包括获取控件类型、使用dir查看支持的方法、获取控件文本内容、子元素、类名以及属性。主要涉及的方法有wrapper_object()、texts()、children()和get_properties()。为了方便学习和记忆,宏哥也整理成表格的形式。如下表所示:
3.1查看控件的子元素
从上边的表格中,我们知道使用children()方法获取控件的子元素。
3.1.1代码设计

3.1.2参考代码
# -*- coding:utf-8 -*-# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。'''Created on 2026-10-16@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(win.children())# 获取菜单的子元素print(menu.children())print(file.children())3.1.3运行代码
1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

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

3.2查看控件类名
从上边的表格中,我们知道使用class_name()方法获取控件的类名。
3.2.1代码设计

3.2.2参考代码
# -*- coding:utf-8 -*-# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。'''Created on 2026-10-16@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(win.children())# 获取菜单的子元素# print(menu.children())# print(file.children())# 获取控件的类名print(win.class_name())3.2.3运行代码
1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

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

3.3查看控件属性,返回字典
从上边的表格中,我们知道使用get_properties()方法获取控件的类名。
3.3.1代码设计

3.3.2参考代码
# -*- coding:utf-8 -*-# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。'''Created on 2026-10-16@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(win.children())# 获取菜单的子元素# print(menu.children())# print(file.children())# 获取控件的类名# print(win.class_name())# 获取控件的属性,返回的字典print(menu.get_properties())3.3.3运行代码
1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

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

4.拓展知识
使用control_count()方法获取子控件的个数。
4.1代码设计

4.2参考代码
# -*- coding:utf-8 -*-# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。'''Created on 2026-10-16@author: 北京-宏哥北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)Project: PC端自动化测试实战教程-18-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())# 获取子控件个数print(menu.control_count())4.3运行代码
1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

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

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

因工作繁忙,暂时做不到日更
每周一、周五早9:00左右准时更新(特殊情况例外)
如果你喜欢我的文章,记得点赞+关注
更多干货,与你分享

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

右下角,您点赞和推荐
宏哥工资涨2毛

关注公众号,阅读更多技术干货👇
🧐 点击「推荐」,给宏哥加个鸡腿吧👇















































































