【GUI自动化测试】2.pywinauto_打开程序+定位窗口

文章目录

  • [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 :⽬标的进程ID
  • handle :⽬标的窗⼝句柄

注意:连接到已在运⾏的进程,该动作仅根据⼀个参数执⾏。

⽰例1:打开记事本程序

python 复制代码
import time
from pywinauto.application import Application
# 连接已经打开的应⽤程序
# 通过pid连接
# 这个7692就是进程pid
app = Application(backend="uia").connect(process=7692)

因为这个已经打开了,所以运行后没什么反应。

我们也可以通过handle句柄来实现这个操作,不过需要用到一个新的工具:ViewWizard2.exe(这个用的比较少)

打开后默认长这样:

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

通过句柄连接已经打开的应用程序:

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())

打印:

相关推荐
测试_AI_一辰3 天前
Playwright执行原理拆解(测试视角)
人工智能·功能测试·ai编程
独断万古他化3 天前
【抽奖活动管理平台】完整质量测试报告:功能 / 自动化 / 性能三大维度总结
功能测试·自动化·接口测试·测试报告·ui测试
智擎软件测评小祺4 天前
软件非功能测试全流程探析
功能测试·检测·cma·第三方检测·cnas·软件非功能测试·软件非功能测试流程
川石课堂软件测试4 天前
涨薪技术|Prometheus使用Recoding Rules优化性能
功能测试·测试工具·jmeter·mysql·面试·单元测试·prometheus
qq_452396234 天前
【测试之道】第六篇:缺陷管理论 —— Bug 的生态位、生命周期与根因分析(RCA)
功能测试·bug·软件工程
qq_452396234 天前
【测试之道】第七篇:非功能性测试 —— 性能、安全与兼容性:构建软件的“硬核”防御
功能测试·安全·bug·软件工程
llilian_164 天前
信号失真度测试仪 自动失真测试仪 低失真度自动测量仪为各行业精准赋能 自动失真仪
网络·功能测试·单片机·测试工具
qq_452396235 天前
【测试之道】第四篇:分层测试论 —— 金字塔、奖杯与蜂巢:构建你的质量防御阵型
功能测试·软件工程
tiantianuser6 天前
RDMA设计67: RDMA设计总结
功能测试·rdma·高速传输·cmac·roce v2