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

打印:

相关推荐
程序员潇潇14 小时前
pytest 参数化测试用例构建
自动化测试·软件测试·功能测试·程序人生·职场和发展·测试用例·pytest
可可南木19 小时前
3070文件格式--17--设备文件
功能测试·测试工具·pcb工艺
weixin_4407305021 小时前
05接口测试-01接口理论+02posman的使用
功能测试·测试工具·postman
苦学编程的谢5 天前
好运buff机 ------ 测试报告
java·开发语言·功能测试
观音山保我别报错9 天前
抽奖项目-接口自动化测试
功能测试·测试工具·单元测试
测试_AI_一辰9 天前
项目实战15:Agent主观题怎么评测?先定底线,再做回归
开发语言·人工智能·功能测试·数据挖掘·ai编程
Elastic 中国社区官方博客10 天前
AI 可观察性:公共部门使命韧性的支柱
大数据·人工智能·功能测试·elasticsearch·搜索引擎·语言模型·全文检索
Mr_Xuhhh10 天前
Web自动化测试入门:Selenium实现百度搜索自动化
功能测试
在坚持一下我可没意见12 天前
ideaPool论坛系统测试报告
java·spring boot·功能测试·selenium·jmeter·mybatis·压力测试