一、pywinauto安装
输入pip -V检查安装的python是否能用,用不了的话去配python的环境变量
1.1、在线安装:pip install -U pywinauto
\-U表示升级安装。安装完成后在Pycharm中输入:from pywinauto.application import Application若没有出现错误提示,则说明该模块安装成功。
1.2、离线安装
搜索pypi的网站,他是python第三方库的管理平台



下载安装包后,解压缩
放到python的安装目录下,切换到终端:运行python setup.py install
安装成功
1.3、工具介绍
1.3.1、Inspect(定位元素工具(uia))
计算机自带的inspect.exe(Windows SDK中的UI自动化检查器),路径为:C:\Program Files (x86)\Windows Kits\10\bin\x86

点击inspect左上角的下拉列表中切换到UI Automation,如果可以看到树状结构,能解析出来元素,说明该窗口是uia

学会看打印出的控件,就可以不用这个工具了
二、pywinauto操作使用
2.1、打开/连接应用程序
打开/连接应用程序,首先我们要确定我们应用程序的可访问技术是什么。
应用的可访问技术一共有两种,分别是uia和win32。我们使用下面的代码:
IDE = Application(backend="win32").start(path=app\_path)
如果可以连接并打开应用,说明应用是win32的,反之就是uia的。
pywinauto中backend参数的默认值就是win32,所以win32的应用可以不写,示例如下:
from pywinauto import Application
# 应用程序的路径
app_path = r'E:\sdrIDE0103\sdrIDE2.7.3\sdrIDE2.7.3.exe'
# 打开应用程序
IDE = Application(backend="win32").start(path=app_path) # 或者IDE = Application().start(path=app_path)
因为我们IDE如果用start()打开的话,会在我们这个python工程路径下打开一个工作空间,数据会保存在python工程路径下,
这并不是我们想要的,所以不用start()来打开IDE,而是用connect()来连接已经打开的应用程序,示例如下:
from pywinauto import Application
# 应用程序的路径
app_path = r'E:\sdrIDE0103\sdrIDE2.7.3\sdrIDE2.7.3.exe'
# 连接应用程序
IDE = Application(backend="win32").connect(path=app_path) # 或者IDE = Application().connect(path=app_path)
这段代码运行完的效果如下:

注意:连接应用程序还可以通过进程号、句柄连接,不过他们会随着每次打开窗口而变化,所以一般不使用
2.2、选择窗口
通过窗口标题选择窗口:
窗口对象=应用\["窗口标题"\]
除了这种方式,还有: 窗口对象=应用(title=“窗口标题”) 窗口对象=应用.窗口标题——中文窗口名不建议用这种方式 窗口对象=应用.window(title=“窗口标题”) |
from pywinauto import Application
app_path = r'E:\sdrIDE0103\sdrIDE2.7.3\sdrIDE2.7.3.exe' # 应用程序的路径
IDE = Application(backend="win32").connect(path=app_path) # 连接应用程序,或者IDE = Application().connect(path=app_path)
sdrwindow = IDE["SDR集成开发环境"] # sdrwindow = IDE.window(title='SDR集成开发环境')
sdrwindow.maximize() # 最大化窗口
这段代码运行完的效果:打开sdrIDE,并且窗口是最大化的:

注意:还可以通过类名选择窗口,通过print_control_ifdentifiers()方法打印出窗口的所有控件,查找类名。等下说这个。
三、窗口的操作方法
除了上面已经做过的最大化窗口,还有几种窗口的操作后面会使用到
序号 |
作用 |
方法 |
备注 |
1 |
窗口最大化 |
窗口.maximize() |
|
2 |
窗口最小化 |
窗口.minimize() |
|
3 |
关闭窗口 |
窗口.close() |
|
4 |
获取窗口的显示状态 |
窗口.get_show_state() |
最大化是1,正常是0 |
5 |
获取窗口显示的坐标 |
窗口.rectangle() |
返回值是(Lxxx,Txxx,Rxxx,Bxxx) |
6 |
查看当前窗口中的所有控件 |
窗口.print_control_identifiers() |
|
四、窗口上控件的选择
控件,就是窗口中的元素、内容。
下面是控件的一些分类:
控件 |
标识 |
控件 |
标识 |
静态内容 |
Static |
编辑框 |
Edit |
按钮 |
Button |
头部内容 |
Header |
单选框 |
RadioButton |
列表框 |
ListBox |
复选框 |
CheckBox |
列表显示控件 |
ListView |
组框 |
GroupBox |
弹出菜单 |
PopupMenu |
组合框 |
ComboBox |
选项卡控件 |
TabControl |
对话框(窗口) |
Dialog |
菜单 |
Menu |
工具栏 |
Toolbar |
工具栏提示 |
ToolTips |
树状视图 |
Tree View |
菜单项 |
MenuItem |
窗格 |
Pane |
状态栏 |
StatusBar |
pywinauto中提供了一个方法可以让我们查看当前窗口中的所有控件:窗口.print\_control\_identifiers()

截取的一部分:

可以看到,打印出的控件有很多,而且是很有规律的,每部分几乎都是由3行组成。举个例子:
SWT\_Window0 - '' (L1594, T760, R1919, B1004)
\['SWT\_Window0', 'SWT\_Window00', 'SWT\_Window01'\]
child\_window(class\_name="SWT\_Window0")
1. 第一行SWT\_Window0是控件类型,不过不是一个标准类型的控件,有关控件类型可以看上面列出的窗口控件的分类
2. SWT\_Window0 - '' (L1594, T760, R1919, B1004) 中,引号中的内容是这个控件的标题,标题为空,但是我们可以
通过第二行中括号里面的某一个标题来唯一标识这个控件
3. (L1594, T760, R1919, B1004) 表示SWT\_Window0 控件在界面中的位置,单位是像素,我们可以通过截图方法,将这个
控件截图,就可以看到这个控件到底是界面中的什么元素了,截图等下说
5. 第三行说明这个控件他的子窗口的类名是SWT\_Window0
五、打印部分控件
5.1、通过控件类型打印

在欢迎界面,这个代码实现的是,将控件标题为:SDR集成开发环境SWT\_Window013的控件下的所有控件打印出来。
注意:SWT_Window013是中括号中的内容
获取方式可以是.(.只适用于英文),也可以是中括号
from pywinauto import Application
app_path = r'E:\sdrIDE0103\sdrIDE2.7.3\sdrIDE2.7.3.exe' # 应用程序的路径
IDE = Application(backend="win32").connect(path=app_path) # 连接应用程序,或者app = Application().connect(path=app_path)
sdrwindow = IDE["SDR集成开发环境"] # 定位窗口。或者sdrwindow = IDE(title="SDR集成开发环境")或者sdrwindow = IDE.SDR集成开发环境 或者sdrwindow = IDE.window(title='SDR集成开发环境')
sdrwindow.maximize() # 最大化窗口
ck=sdrwindow["SDR集成开发环境SWT_Window013"] # 选择部分控件。或者ck=sdrwindow.SDR集成开发环境SWT_Window013
print(ck.print_control_identifiers())
执行完的效果:
D:\python36\python.exe G:\yongli_Framework\src\testpywinauto.py
Control Identifiers:
SWT_Window0 - '' (L536, T319, R1887, B971)
['SWT_Window0']
child_window(class_name="SWT_Window0")
|
| Shell Embedding - '' (L536, T319, R1887, B971)
| ['Shell Embedding']
| child_window(class_name="Shell Embedding")
| |
| | Shell DocObject View - '' (L536, T319, R1887, B971)
| | ['Shell DocObject View']
| | child_window(class_name="Shell DocObject View")
| | |
| | | Internet Explorer_Server - '' (L536, T319, R1887, B971)
| | | ['Internet Explorer_Server']
| | | child_window(class_name="Internet Explorer_Server")
| |
| | Internet Explorer_Server - '' (L536, T319, R1887, B971)
| | ['Internet Explorer_Server']
| | child_window(class_name="Internet Explorer_Server")
|
| Shell DocObject View - '' (L536, T319, R1887, B971)
| ['Shell DocObject View']
| child_window(class_name="Shell DocObject View")
| |
| | Internet Explorer_Server - '' (L536, T319, R1887, B971)
| | ['Internet Explorer_Server']
| | child_window(class_name="Internet Explorer_Server")
|
| Internet Explorer_Server - '' (L536, T319, R1887, B971)
| ['Internet Explorer_Server']
| child_window(class_name="Internet Explorer_Server")
None
Process finished with exit code 0
如果还想将里面的子窗口打印出来,直接在后面添加中括号就可以
注意:如果中括号不行,执行完成报错,可以使用child\_window()方法定位控件
下面这个代码实现的是,打印上面打印出的控件中,Shell Embedding控件下的所有控件:
from pywinauto import Application
app_path = r'E:\sdrIDE0108\sdrIDE2.7.3\sdrIDE2.7.3.exe' # 应用程序的路径
IDE = Application(backend="win32").connect(path=app_path) # 连接应用程序,或者app = Application().connect(path=app_path)
sdrwindow = IDE["SDR集成开发环境"] # 定位窗口。或者sdrwindow = IDE(title="SDR集成开发环境")或者sdrwindow = IDE.SDR集成开发环境 或者sdrwindow = IDE.window(title='SDR集成开发环境')
sdrwindow.maximize() # 最大化窗口
ck=sdrwindow["SDR集成开发环境SWT_Window013"].child_window(class_name="Shell Embedding")# 选择部分控件。或者ck=sdrwindow.SDR集成开发环境SWT_Window013
print(ck.print_control_identifiers())
执行完的效果:
D:\python36\python.exe G:\yongli_Framework\src\testpywinauto.py
Control Identifiers:
Shell Embedding - '' (L536, T319, R1887, B971)
['Shell Embedding']
child_window(class_name="Shell Embedding")
|
| Shell DocObject View - '' (L536, T319, R1887, B971)
| ['Shell DocObject View']
| child_window(class_name="Shell DocObject View")
| |
| | Internet Explorer_Server - '' (L536, T319, R1887, B971)
| | ['Internet Explorer_Server']
| | child_window(class_name="Internet Explorer_Server")
|
| Internet Explorer_Server - '' (L536, T319, R1887, B971)
| ['Internet Explorer_Server']
| child_window(class_name="Internet Explorer_Server")
None
Process finished with exit code 0
六、控件的相关属性获取
序号 |
作用 |
方法 |
备注 |
1 |
获取控件类型 |
wrapper_object() |
|
2 |
获取该控件支持的方法 |
print(dir(a.wrapper_object())) |
|
3 |
控件文本内容的获取 |
## texts () |
|
4 |
获取控件的子元素 |
children |
|
5 |
获取控件类名 |
class_name |
|
6 |
获取控件的属性 |
get_properties |
|
6.1、获取控件类型:wrapper_object()
可以获取控件的类型,控件类型第四节开头总结过
以下代码在上面代码的基础上,打印出窗口的控件类型:
print(ck.wrapper\_object()) #获取ck窗口的控件类型并打印
from pywinauto import Application
app_path = r'E:\sdrIDE0108\sdrIDE2.7.3\sdrIDE2.7.3.exe' # 应用程序的路径
IDE = Application(backend="win32").connect(path=app_path) # 连接应用程序,或者app = Application().connect(path=app_path)
sdrwindow = IDE["SDR集成开发环境"] # 定位窗口。或者sdrwindow = IDE(title="SDR集成开发环境")或者sdrwindow = IDE.SDR集成开发环境 或者sdrwindow = IDE.window(title='SDR集成开发环境')
sdrwindow.maximize() # 最大化窗口
ck=sdrwindow["SDR集成开发环境SWT_Window013"].child_window(class_name="Shell Embedding")# 选择部分控件。或者ck=sdrwindow.SDR集成开发环境SWT_Window013
print(ck.print_control_identifiers())
print(ck.wrapper_object()) #获取ck窗口的控件类型并打印
执行完的效果:
hwndwrapper.HwndWrapper - '', Shell Embedding
D:\python36\python.exe G:\yongli_Framework\src\testpywinauto.py
Control Identifiers:
Shell Embedding - '' (L536, T319, R1887, B971)
['Shell Embedding']
child_window(class_name="Shell Embedding")