7 | 如何测试Windows应用程序
7 | 如何测试Windows应用程序7.1 前言本教程主要讲解如何使用AirtestIDE进行Windows应用程序的自动化测试(以网易云音乐Windows版为案例)。 通过阅读本文,你将学会:
7.2 基本原理AirtestIDE对普通Windows应用程序测试的支持,主要依靠图像识别框架(Airtest)进行位置定位,使用pywinauto的操作接口进行模拟操作。 Poco在Windows上的支持尚未推出,我们将会尽快推出该功能,敬请期待。 7.3 在AirtestIDE中连接Windows窗口要使用AirtestIDE测试某个Windows程序,首先要将待测试的Windows窗口与AirtestIDE进行连接,其实也就是将Windows窗口的句柄告诉给AirtestIDE。在成功连接窗口后,Airtest能够将该窗口作为一个设备,接下来就像在操作一台Android设备一样,能够对Windows窗口进行图像识别、点击操作等。 注意:由于选定连接Windows窗口后,在AirtestIDE中操作、运行脚本时,将会依赖这个特定的窗口句柄。因此在窗口选定后请不要随意关闭,否则会导致运行时无法找到对应窗口而报错。 7.3.1 常规连接方法:一键嵌入AirtestIDE提供了一键嵌入Windows窗口的功能,如下所示: 点击AirtestIDE的选定窗口按钮,将可以选择桌面上一个已经启动的Windows应用(此时窗口边缘将会显示绿色方框),把它嵌入到AirtestIDE中。嵌入窗口后,可以方便地在AirtestIDE中操作窗口、录制语句、运行脚本。 7.3.2 另一种备用的连接方法由于Windows应用的底层实现各不相同,有些应用窗口如果使用默认的一键嵌入方法,在嵌入到AirtestIDE里之后会遇到一些问题(例如嵌入后无法用鼠标操作、无法正常嵌入、嵌入后无法显示图像等)。 针对这些问题,我们提供了一种无嵌入连接的方案,请在AirtestIDE的设置面板中,找到Device-Windows Embed Backup Method,勾选后即可使用备用方案来连接窗口。 接下来的连接方式和常规方法一样,点击选定窗口,然后选择待测窗口程序: 从图中可以看到,这种窗口连接方式不会将Windows窗口嵌入到AirtestIDE里,虽然在脚本录制时不如默认嵌入方式简单好用,但是能够避免一些窗口嵌入带来的问题。 7.3.3 桌面模式假如想要测试的窗口不止一个(拥有多个不同的窗口句柄),单独嵌入一个窗口可能无法满足测试需求,此时我们也提供了第三种方案:桌面模式。 点击桌面模式按钮,此时AirtestIDE右侧的设备窗口将会完全隐藏,进入Windows桌面模式。 在此模式下,录制脚本与运行脚本都与正常情况下没有区别,只不过执行时将会对整个桌面进行截图识别,甚至可以识别到AirtestIDE代码窗口里的截图语句(因此在执行脚本时,请尽量缩小AirtestIDE的窗口,避免脚本界面里的截图干扰执行结果)。 7.3.4 连接注意事项
7.3.5 退出Windows连接
7.4 录制与编写Airtest脚本成功连接上Windows窗口,就相当于我们已经连接上了一台设备,接下来就可以对它进行脚本的录制与回放了。 7.4.1 生成截图语句首先,touch / wait / exists / assert_exists / assert_not_exists等Airtest带有截图的语句,与在Android/iOS设备上录制并没有太大区别: 但是需要注意的是,在使用鼠标拖拽框选好想要截图的位置后,需要双击该截图区域才能完成截图,而不会在鼠标松开时自动完成截图,这也是与Windows下截图的最大区别。 因此截图的步骤是:
以及,在录制swipe语句时,在完成截图区域框选后,需要单击滑动终点完成语句录制。 7.4.2 调用Windows接口和Android/iOS一样,Airtest也对Windows下的常用操作进行了封装,底层操作接口使用的是pywinauto库。 因此,在编写Windows应用的测试脚本时,我们可能需要查阅以下几个API文档:
(1)一个简单的示例为了方便演示,我们假设这个脚本没有在命令行中传入参数,而是在脚本里使用connect_device接口来连上一个句柄为123456的窗口,并对它进行一些操作: from airtest.core.api import * dev = connect_device("Windows:///123456") # 通用的接口调用方式,与其它平台相同: touch(图片)
假如我们希望能够调用一些Windows的专属操作,比如查阅了Airtest的Windows专属API文档后,我们发现有一些操作是只有Windows窗口才有的: # 调用Windows专属的接口,例如获取当前窗口的标题内容 print(dev.get_title()) # 把窗口移动到某个坐标位置 dev.move((100,200))
接下来,假设我们现在想要使用鼠标滚轮,在查阅Airtest的API后发现,Airtest的Windows模块并没有封装鼠标滚轮的功能,此时我们可以进一步查询pywinauto的文档,寻找到mouse相关的章节后,就知道如何调用鼠标滚轮接口了: dev.mouse.scroll(coords=(80,100),wheel_dist=1)
(2)输入KeyEvent在Android中,我们可以通过KeyEvent(“HOME”)来实现按下HOME键的操作,而在Windows中,我们同样可以通过KeyEvent接口发送一些按键响应。Android的按键码是基于ADB的,而Airtest的Windows模块则封装使用了pywinauto支持的按键码,请查阅pywinauto.keyboard文档内容来编写Windows下的KeyEvent接口参数: # 在pywinauto中,符号^也代表了CTRL键,因此^a即为全选(Ctrl+A) keyevent("^a") # 例如这是删除键的输入方式,需要加上括号{} keyevent("{DEL}")
请大家根据实际需求,查阅文档后再编写按键响应的代码。 7.5 如何在运行脚本时,指定连接某个窗口在AirtestIDE的Windows模式中,运行脚本和查看报告与其它平台并无不同: 然而,最需要注意的一点是:在AirtestIDE里连接的窗口,都是用窗口句柄连接的。窗口句柄是每个Windows窗口对象拥有的独一无二的32位无符号整数,而且每次打开窗口,这个数值都会变化。 这就意味着,假如我们用某个窗口嵌入到AirtestIDE里写出了一个脚本,虽然这次可以直接运行,但是通过复制AirtestIDE里的脚本命令行的方式,是无法保证下一次还能够运行的。因为AirtestIDE里的命令行,将会有这样的参数内容 因此,我们也可以不使用句柄,而是通过其它的方式来连接窗口。Airtest的Windows模块,使用了pywinauto的connect接口来连接窗口,因此除了句柄以外,我们可以通过窗口标题来连接: # 连接一个Windows窗口,窗口句柄为123456 Windows:///123456 # 连接一个Windows窗口,窗口名称匹配某个正则表达式 Windows:///?title_re=Unity.* # 连接windows桌面,不指定任何窗口,对应IDE的桌面模式 Windows:///
在命令行中假如想使用窗口名称连接,不需要添加引号等符号,直接这样写: airtest run test.air --device Windows:///?title_re=Unity.*
7.6 Poco支持7.6.1 接入了Poco-SDK的Windows窗口有一些Windows-App已经接入了Poco(例如Unity游戏窗口),我们同样能够使用AirtestIDE来方便地查看和选中UI节点。但是在使用这个功能前,需要事先告诉AirtestIDE这个Windows窗口所在位置以及窗口大小。 在“选项”-“设置”-“Poco”,选择“Windows Content Area Rect”,框选窗口主画面后双击确认(右键/esc可取消),随后即可开始使用Poco相关功能了,如图所示: 7.6.2 Poco-Windows支持针对Windows窗口的Poco支持,我们正在完善文档和功能,敬请期待。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- windows-server-2003 – 对于Windows nslookup,“默认服务器
- windows – 一次检查所有git存储库的状态
- Extjs窗口中的视频未扩展到全屏
- Win10系统,QQ截图时画面变大的解决方法
- windows – 为什么COM CoInitializeSecurity在我的DLL中失败
- 在Windows FF中显示边框的CSS透明边框
- windows-phone-7 – 是否隐藏Windows Phone 7应用程序中的系
- windows – 如何禁用引号的自动配对[closed]
- 使用语义记录Windows Azure配置PartitionKey
- 无法启动此程序,因为计算机中丢失QtCored4.dll。尝试重新安
- Windows10鼠标指针不停转圈的罪魁祸首:搜狗输入
- windows-server-2012 – Windows Server 2012 –
- Microsoft Visual C#2008减少加载dll的数量
- Windows批处理中嵌套循环中的“continue”等效命
- Windows上的python select.select()
- Win10常用快捷键
- microsoft-office-365 – Office 365 – Outlook
- 窗口 – 为什么findstr不正确处理(在某些情况下)
- DwmIsCompositionEnabled仍在Windows 8中使用吗?
- Windows – Hyper-V – DELL PowerEdge R710上没