AirtestProject Airtest 测试 Windows 窗口翻车?还是想跟你们聊聊测试 win 窗口的一些问题
此文章来源于项目官方公众号:“AirtestProject”
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途
前言
很多同学反馈在测试 Windows 应用窗口的时候,经常遇到 窗口连接不上 、不知道窗口句柄是什么 ,发送 删除/回车 等 keyevent
的时候总是 不生效 的情况,所以今天我们带大家一起来看看用 airtest 测试 Windows 窗口的常见问题。
1.在 IDE 中连接 Windows 窗口
airtest 提供了多种连接 Windows 应用窗口的方法,嵌入式连接和无嵌入式连接等,如果你使用嵌入式连接的方式不能正常连接待测的 Windows 窗口,比如出 现窗口被拉伸 、窗口黑屏、不能正常录制脚本 等情况,你还可以选择用无嵌入式连接或桌面模式。
嵌入式连接
而嵌入式连接又分两种,一种是 “选定窗口”,另外一种是 “搜索窗口”。
“选定窗口” 的方式很简单,直接在 IDE 的 Windows 窗口连接那块面板上点击 “选定窗口”,之后再把鼠标移动到待测窗口上,此时待测窗口会被一个绿色的矩形框圈住,单击鼠标左键即可把待测窗口嵌入到我们的 IDE 中:
当然如果我们不使用 “选定窗口”,而是使用其旁边的 “搜索窗口”,IDE 则会弹出一个当前所有已打开窗口的 title 列表,此时我们只需要找到待测窗口的 title,然后点击右侧对应的 连接
按钮即可把应用窗口嵌入到我们的 IDE 中:
无嵌入式连接
无嵌入式连接,即 不用把应用窗口嵌入到 IDE 上去,依旧可以对待测应用进行自动化测。在 IDE 的顶部菜单栏依次选择 选项--设置--勾选上Windows窗口无嵌入连接--OK
,之后再点击 “选定窗口”,将鼠标移动到待测窗口上并单击,此时应用窗口没有被嵌入到 IDE 中,并且 IDE 的设备窗口也会自动隐藏起来。之后我们就可以像嵌入窗口那样对待测应用进行自动化测试操作:
桌面模式
假如同学们想要测试的窗口不止一个(即拥有多个不同的窗口句柄),单独 嵌入/选定 一个窗口可能无法满足测试需求,此时我们就可以使用 “桌面模式”。
点击桌面模式按钮,此时 AirtestIDE 右侧的设备窗口将会完全隐藏,进入 Windows 桌面模式。在此模式下,录制脚本与运行脚本都与正常情况下没有区别,只不过执行时将会对整个桌面进行截图识别,甚至可以识别到 AirtestIDE 代码窗口里的截图语句(因此在执行脚本时,请尽量缩小 AirtestIDE 的窗口,避免脚本界面里的截图干扰执行结果)。
2.用代码连接 Windows 窗口
使用窗口句柄
在 AirtestIDE 里连接的窗口,都是用窗口句柄连接的。窗口句柄是每个 Windows 窗口对象拥有的独一无二的 32 位无符号整数,而且每次打开窗口,句柄的数值都会变化。
这就意味着,假如我们用某个窗口嵌入到 AirtestIDE 里写出了一个脚本,虽然这次可以直接运行,但是通过复制 AirtestIDE 里的脚本命令行的方式,是无法保证下一次还能够运行的。因为 AirtestIDE 里的命令行,将会有这样的参数内容 --device Windows:///句柄
,而下次再打开窗口,可能句柄已经发生了变化。
使用句柄连接窗口的脚本我们可以这么写:
auto_setup(__file__,devices=["Windows:///133194"])
但是该连接脚本仅对本次打开的 Windows 窗口有效,如果 Windows 窗口被关闭后重新打开,句柄也将会发生变化,该脚本失效。
使用正则表达式
上文我们提到,使用 “搜索窗口” 连接窗口的时候,IDE 会列出当前所有打开窗口的 title,我们可以 写一个正则表达式去匹配到待测窗口的 title,并使用这个正则表达式来连接该窗口:
# 例如匹配“吹梦到西洲”后面跟着换行符以外的任意字符的窗口title
auto_setup(__file__,devices=["Windows:///?title_re=吹梦到西洲.*"])
大多数情况下,窗口的 title 比较不容易变化,所以使用正则表达式匹配窗口 title 来连接待测窗口的脚本,会相对稳定些。
连接整个桌面
如果不需要置顶某个窗口应用的话,我们还可以使用如下代码直接连接整个桌面来做自动化:
auto_setup(__file__,devices=["Windows:///"])
3.在 Windows 应用上发 keyevent
最后我们来看一下在 Windows 应用上发送 keyevent
的失效的问题。举个很常见的例子:很多同学反馈,自己想在 Windows 窗口的某个输入框内删除一些字符,所以使用了 DELETE
这个键码,但是实际运行效果是不仅没有生效,而且还把键码 DELETE
写到了输入框里面,这是为什么呢?
其实是因为同学们把 Android 的按键码和 Windows 的按键码混淆了。Android 的按键码是基于 ADB 的,而Airtest 的 Windows 模块则封装使用了pywinauto
支持的按键码,所以这就导致了 DELETE
键码在 Android 设备中生效,而在 Windows 窗口就不生效。
在 pywinauto
库中,删除的键码实际上是 {DELETE}
,所以我们想要在 Windows 窗口上实现删除字符的效果,可以这么写:
keyevent("{DELETE}")
更多 Windows 的键码可以参照下图,我们可以看到,Windows 的键码都是用 {}
框起来的:
在 keyevent()
中不使用 {}
框起来的字符,都会被当成需要输入的字符串,被输入到 Windows 窗口的输入框上。
Airtest 官网:airtest.netease.com/
Airtest 教程官网:airtest.doc.io.netease.com/
搭建企业私有云服务:airlab.163.com/b2b