
就是那个揭开它的人。
真相只有一个,而我,

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

.

.

阅读本文

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 02.3窗口控件类型
将控制台的窗口控件类型进行整理分类,如下表所示:
3.窗口控件的相关属性
窗口控件的类型我们了解后,就进入今天的主题:窗口控件的相关属性 如何获取,下边来跟随宏哥一步一步来学习。宏哥这里还是以记事本窗口为例,如何使用pywinauto库在Python中操作Windows应用程序,如记事本,包括获取控件类型、使用dir查看支持的方法、获取控件文本内容、子元素、类名以及属性。主要涉及的方法有wrapper_object()、texts()、children()和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获取应用程序窗口控件的相关属性的几种方法函数,比较简单容易。直接调用即可。好了,今天时间也不早了,宏哥就讲解和分享到这里,感谢您耐心的阅读,希望对您有所帮助。

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

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

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

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