此文章来源于项目官方公众号:“AirtestProject”
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途
之前有同学留言说想看 Windows 应用的自动化,那么今天我们就用 1 个简单的例子,带大家一起来看一下 Windows 应用的自动化究竟有哪些坑。
不过在此之前,希望大家能认真看一下 “如何连接 Windows 应用窗口” 的教程,里面详细描述了多种连接 Windows 窗口的模式。
因为桌面应用的多样化,IDE 连接各种 Windows 窗口也会出现各种各样的问题,同学们在连接 Windows 窗口时如果出现问题,比如 无法嵌入、连接后闪退、连接后窗口被拉伸 等等,建议同学们多尝试几种连接方式,总会找到一种比较好的连接方式。
另外,因为同学们平常多使用移动设备进行测试,换成测试 Windows 应用时,很容易把一些移动设备才有的接口用到 Windows 应用上面,导致接口失效,达不到预期效果的情况,下文我们也会详细跟大家讲述一下,帮助大家避坑。
我们以网易云音乐的 Windows 客户端为例,实现在网易云音乐中搜索 “薛之谦”,然后找到他的歌单排名,将排名前 10 的歌曲加入 “我喜欢的音乐” 列表,之后删除搜索框的内容,最后回到网易云音乐的首页。
为防止其它应用窗口干扰连接,我们 在桌面上只留下 IDE 窗口和待测的网易云音乐窗口 。然后我们在 Windows 窗口连接里选择 “选定窗口”,再单击选中网易云音乐的窗口,嵌入之后发现,网易云音乐的窗口被严重拉伸:
所以我们再尝试一下另外一种嵌入方法,“搜索窗口”。点击 “搜索窗口”,在弹出的窗口列表中,选择网易云音乐的窗口,再点击连接:
发现可以正常嵌入,所以以后我们可以使用搜索窗口这种模式,来嵌入网易云音乐的 Windows 窗口。
AirtestIDE 对普通 Windows 应用程序的测试支持,主要 依靠图像识别框架(Airtest)进行位置定位,使用 pywinauto
的操作接口进行模拟操作 。
最常见的就是模拟键盘/鼠标操作了。上述案例中,我们主要使用了模拟键盘操作,帮助我们在应用上输入关键词、使用快捷键以及进行全选删除等操作。
dev = device()
# 输入搜索词,等同于 text("薛之谦")
dev.keyboard.SendKeys("薛之谦")
# 删除输入框的内容,等同于 keyevent("^a"),keyevent("{BACK}")
dev.keyboard.SendKeys("^a")
dev.keyboard.SendKeys("{DELETE}")
其中 '^' 等同于 {VK_CONTROL}
,所以 "^a"
代表的是 "ctrl+a"
,另外 pywinauto.keyboard
这个模块的详细内容可以参考此链接:https://pywinauto.readthedocs.io/en/latest/code/pywinauto.keyboard.html# 。
模拟鼠标操作在上述示例中没有涉及,但它的基本用法与 pywinauto.keyboard
模块是相似的,给大家举个简单的例子,模拟鼠标的右键点击操作:
dev = device()
dev.mouse.right_click(coords=(1180, 145))
pywinauto.mouse
模块的内容可以参考此链接:https://pywinauto.readthedocs.io/en/latest/code/pywinauto.mouse.html 。
之前很多同学跟我们反馈过这样的问题,为什么他们在 Windows 应用上输入各种 keyevent
之后,都只是把键码输入到文字框中,而没有实现键码的效果呢?
如上图所示,我们的预期是删除输入框的文字,但实际效果是把键码一个个输入到了输入框中。其实原因就是我们文章开头所说的,这个键码是应用在安卓平台上的,照抄到 Windows 平台是不适用的:
而 Windows 平台的键码,我们可以参考 pywinauto.keyboard
这个模块给出的键码合集:
实操示例中,我们使用了多条截图语句帮助我们在网易云音乐上进行定位。其中有几个截图的小技巧想分享给大家:
第一点,截图的时候,希望大家 尽量减少截入过多的空白背景 ,空白背景过多容易导致特征点稀少,进而出现截图识别位置错误的问题。
第二点,截图并不一定是越小越精准。当画面中存在多个相似的目标截图时,我们需要灵活地加入一些辅助内容,帮助我们顺利定位到目标。就拿上述示例来说,输入 “薛之谦” 后,我们想要点击下拉列表的第二个薛之谦,但是列表中有很多个干扰元素:
此时,细细地去抠含有薛之谦三个文字的截图就非常不明智了,因为你很难确保程序最终帮你匹配到列表中哪一个位置。但我们尝试换一下思路,适当地将截图扩大一些,增加更多的特征点,让我们的点击目标依然处于截图中心 ,不就可以更准确地定位到我们的目标了吗?
最后一点,巧用 target_pos
帮助我们点击截图的不同位置 。默认情况下,程序在画面上找到截图目标后,会点击截图的中心位置,但实际操作中,我们可能需要点击截图的右下角、中心偏右位置等等,这时候我们只需要设置截图 target_pos
的值即可(取值范围 1~9)。
今天的教程内容就到这里啦,如果同学们还有什么想看的实操案例,欢迎在公众号留言,另外需要上述脚本练手的同学,也可以在公众号 回复 “网易云” 获取示例代码。
Airtest 官网:airtest.netease.com/
Airtest 教程官网:airtest.doc.io.netease.com/
搭建企业私有云服务:airlab.163.com/b2b