文章目录
- [5. pywinauto常⻅操作](#5. pywinauto常⻅操作)
-
- [5.1 打开程序](#5.1 打开程序)
-
- [5.1.1 打开没打开的应⽤程序](#5.1.1 打开没打开的应⽤程序)
- [5.1.2 连接已经打开的应⽤程序](#5.1.2 连接已经打开的应⽤程序)
- [5.2 定位窗⼝](#5.2 定位窗⼝)
-
- [5.2.1 通过⾼级pywinauto API提供的window⽅法来定位](#5.2.1 通过⾼级pywinauto API提供的window⽅法来定位)
- [5.2.2 通过动态解析对象属性定位](#5.2.2 通过动态解析对象属性定位)
5. pywinauto常⻅操作
5.1 打开程序
5.1.1 打开没打开的应⽤程序
python
start(self, cmd_line......)
部分参数详解:
cmd_line:这是启动应⽤程序的命令⾏字符串。它必须包含应⽤程序的路径和名称,还可以包含启动参数
例如:
- "
notepad.exe" :启动记事本程序。- "
C:\\Windows\\system32\\notepad.exe" :使⽤绝对路径启动记事本程序。- "
calc.exe" :启动计算器程序。
代码1打开记事本:
python
import time
from pywinauto.application import Application
# start启动应⽤程序
Application(backend="uia").start("notepad.exe") # 或者:Application(backend="uia").start("C:\\Windows\\system32\\notepad.exe")
'''
不过这里的backend=有uia和win32两种,我们这里使用的UISpy支持访问的技术是uia,对于win32是不支持的,若应用程序访问技术为win32,需要更换UI检查工具:py_inspect之类的
'''
打印:

代码2:打开Sublime Text
python
from pywinauto.application import Application
# start参数换成Sublime Text的⽬标路径
app = Application(backend='uia').start(r"D:\APP\Sublime_Text\Sublime Text\sublime_text.exe")
win = app.window(title_re='.*Sublime Text.*')
5.1.2 连接已经打开的应⽤程序
python
connect(self, **kwargs)
部分参数详解:
process:⽬标的进程IDhandle:⽬标的窗⼝句柄注意:连接到已在运⾏的进程,该动作仅根据⼀个参数执⾏。
⽰例1:打开记事本程序
python
import time
from pywinauto.application import Application
# 连接已经打开的应⽤程序
# 通过pid连接
# 这个7692就是进程pid
app = Application(backend="uia").connect(process=7692)
因为这个已经打开了,所以运行后没什么反应。
我们也可以通过handle句柄来实现这个操作,不过需要用到一个新的工具:ViewWizard2.exe(这个用的比较少)
打开后默认长这样:

使用的时候直接拖动这个app右下角的放大镜到想查询handle的app上就可以了:

通过句柄连接已经打开的应用程序:
python
import time
from pywinauto.application import Application
#通过句柄连接
app = Application(backend="uia").connect(handle=985346)
5.2 定位窗⼝
5.2.1 通过⾼级pywinauto API提供的window⽅法来定位
python
app.window(title='',...)
参数说明(参数可以组合使⽤):这些是常见参数不代表全部
title: ⽂本为指定值的元素。 (精确匹配)title_re: ⽂本匹配指定正则表达式的元素。(正则匹配)best_match: 标题与指定值相似的元素。 (模糊匹配)class_name: 窗⼝类为指定值的元素。 (精确匹配)class_name_re: 类名匹配指定正则表达式的元素。(正则匹配)
⽰例:定位sublime Text窗⼝
title定位:(精确匹配)
python
from pywinauto.application import Application
#获取应⽤程序对应的pid
app = Application(backend="uia").connect(process=19280)
# 查找窗口window
# title--⽂本为指定值的元素--精确匹配
win = app.window(title="C:\\Users\\yudukai\\Desktop\\测试 - Sublime Text (UNREGISTERED)") # title的值可以从下方复制
win.wait("visible") # 这行的意思是上面这个窗口是可见的,如果不可见就会报错。如果我上面一行写错了,这行就会报错,方便错误定位。

class_name定位:(精确匹配)
python
import time
from pywinauto.application import Application
#获取应⽤程序对应的pid
app = Application(backend="uia").connect(process=19280)
# 查找窗口window
# class_name--窗⼝类为指定值的元素--精确匹配
win = app.window(class_name="PX_WINDOW_CLASS") # 这个class_name=错误也会报错
win.wait("visible")

title_re定位:(正则匹配)
python
import time
from pywinauto.application import Application
#获取应⽤程序对应的pid
app = Application(backend="uia").connect(process=19280)
# 查找窗口window
# title_re--⽂本匹配指定正则表达式的元素--正则匹配
win = app.window(title_re=".*lhfjk.*")
win.wait("visible")
注意:有的时候文件没保存没标题,这个时候输入的第一行会默认变成标题,导致标题名字的变化,正则表达式无法匹配。
class_name_re定位:(正则匹配)
python
import time
from pywinauto.application import Application
#获取应⽤程序对应的pid
app = Application(backend="uia").connect(process=10112)
# 查找窗口window
# class_name_re--类名匹配指定正则表达式的元素--正则匹配
win = app.window(class_name_re=".*WINDOW_CLASS")
win.wait("visible")
best_match定位:(模糊匹配)
这个方法和其他方法不太一样,这个相似值我们要选择规定的相似值而不是自己定义的相似值。
python
from pywinauto.application import Application
#获取应⽤程序对应的pid
app = Application(backend="uia").connect(process=10112)
win = app.window(title_re=".*Sublime.*")
win.wait("visible")
win.print_control_identifiers()
打印:

print_control_identifiers()⽅法⽤于打印窗⼝及其⼦控件的标识符信息,帮助⽤户识别控件
输出内容:
- 控件的类名、标题、位置(左、上、右、下边界的坐标值)、控制类型等信息。
- 每个控件的"
best match"名称列表,这些名称可以⽤于引⽤控件。

这个框住的就是每个控件的"best match"名称列表,"best match"的值要从里面选择。
python
'''
['Dialog', 'untitled • - Sublime Text (UNREGISTERED) • - Sublime Text (UNREGISTERED)', 'untitled • - Sublime Text (UNREGISTERED) • - Sublime Text (UNREGISTERED)Dialog']
Dialog
untitled • - Sublime Text (UNREGISTERED) • - Sublime Text (UNREGISTERED)
untitled • - Sublime Text (UNREGISTERED) • - Sublime Text (UNREGISTERED)Dialog
'''
import time
from pywinauto.application import Application
#获取应⽤程序对应的pid
app = Application(backend="uia").connect(process=10112)
# 查找窗口window
# best_match--标题与指定值相似的元素--模糊匹配
win = app.window(best_match="untitled • - Sublime Text (UNREGISTERED) • - Sublime Text (UNREGISTERED)Dialog")
win.wait("visible")
不过运行的时候,有可能会出现报错。
GUI测试受操作系统和软件版本影响很大,如果出现了,大概率是软件版本不一致导致的。也要注意这里的
win.wait("visible"),这个win.wait()有很多参数,有可能因为页面被收到任务栏导致不可见的报错。
5.2.2 通过动态解析对象属性定位
python
#不推荐
app."best_match"名称
⽰例:定位sublime Text窗⼝
python
win = app.Dialog
#上⾯写法等价于
win = app.window(best_match='Dialog')
注意:
Python通过动态解析对象属性简化了创建窗口规范。但是属性名与任何变量名都有相同的限制:没有空格、逗号和其他特殊符号,因此这是不推荐写法。
若存在空格或者其他特殊字符等,可采⽤类似字典的⽅式访问,如:
python
win = app['untitled • - Sublime Text (UNREGISTERED)']
#上⾯写法等价于
win = app.window(best_match="untitled • - Sublime Text (UNREGISTERED)")
最简单的定位窗口⽅法是询问
top_window(),例如:win = app.top_window()注意:
这是⽬前相当未经测试的,所以不确定它会返回正确的窗口。 (不能用的话就要用之前的高级
API提供的window⽅法来定位)它绝对是应⽤程序的顶级窗口,不过它可能不是
Z-Order中最⾼的窗口,也不⼀定是我们想要的窗口。
python
from pywinauto import Application
app = Application(backend="uia").connect(process=10140)
win = app.top_window()
win.wait('exists')
print(win.print_control_identifiers())
打印:
