如何测试Windows应用程序

简介: 如何测试Windows应用程序

前言



本教程主要讲解如何使用AirtestIDE进行Windows应用程序的自动化测试(以网易云音乐Windows版为案例)。


通过阅读本文,你将学会:


  • 使用AirtestIDE对一个Windows软件窗口进行脚本录制
  • 如何调用Windows操作的接口
  • 如何在脚本和命令行里指定连接某个Windows窗口


1. 基本原理



AirtestIDE对普通Windows应用程序的测试支持,主要依靠图像识别框架(Airtest)进行位置定位,使用 pywinauto的操作接口进行模拟操作。



Poco在Windows上的支持暂时尚未推出,我们将会尽快推出该功能,敬请期待。


2. 在AirtestIDE中连接Windows窗口



要使用AirtestIDE测试某个Windows程序,首先要将待测试的Windows窗口与AirtestIDE进行连接,其实也就是将Windows窗口的句柄告诉给AirtestIDE。在成功连接窗口后,Airtest能够将该窗口作为一个设备,接下来就像在操作一台Android设备一样,能够对Windows窗口进行图像识别、点击操作等。


注意: 由于选定连接Windows窗口后,在AirtestIDE中操作、运行脚本时,将会依赖这个特定的窗口句柄。因此在窗口选定后请不要随意关闭,否则会导致运行时无法找到对应窗口而报错。


常规连接方法-一键嵌入


AirtestIDE提供了一键嵌入Windows窗口的功能,如下所示:



点击AirtestIDE的选定窗口按钮,将可以选择桌面上一个已经启动的Windows应用(此时窗口边缘将会显示绿色方框),把它嵌入到AirtestIDE中。嵌入窗口后,可以方便地在AirtestIDE中操作窗口、录制语句、运行脚本。


另一种备用的连接方法


由于Windows应用的底层实现各不相同,有些应用窗口如果使用默认的一键嵌入方法,在嵌入到AirtestIDE里之后会遇到一些问题(例如嵌入后无法用鼠标操作、无法正常嵌入、嵌入后无法显示图像等)。


针对这些问题,我们提供了一种无嵌入连接的方案,请在AirtestIDE的设置面板中,找到Device-Windows Embed Backup Method,勾选后即可使用备用方案来连接窗口。

接下来的连接方式和常规方法一样,点击选定窗口,然后选择待测窗口程序:



从图中可以看到,这种窗口连接方式不会将Windows窗口嵌入到AirtestIDE里,虽然在脚本录制时不如默认嵌入方式简单好用,但是能够避免一些窗口嵌入带来的问题。


桌面模式


假如想要测试的窗口不止一个(拥有多个不同的窗口句柄),单独嵌入一个窗口可能无法满足测试需求,此时我们也提供了第三种方案:桌面模式。



点击桌面模式按钮,此时AirtestIDE右侧的设备窗口将会完全隐藏,进入Windows桌面模式。


在此模式下,录制脚本与运行脚本都与正常情况下没有区别,只不过执行时将会对整个桌面进行截图识别,甚至可以识别到AirtestIDE代码窗口里的截图语句(因此在执行脚本时,请尽量缩小AirtestIDE的窗口,避免脚本界面里的截图干扰执行结果)。


连接注意事项


  • 由于在选定窗口时,桌面上可能会有不少同时打开着的其他窗口,导致选择时的绿色方框不一定能够很准确地框选到被测应用,请大家在点击选定窗口按钮之前,尽可能先把所有其他无关窗口都最小化,这样做可以让窗口选择更准确。
  • 为了防止出现异常情况,请不要选择自己的桌面、AirtestIDE软件本体。因为窗口嵌入的功能原理是,将一个Windows窗口设置为IDE的子窗口,因此如果试图连接桌面,可能会导致无法预料的异常情况发生。如果只是想测试桌面上的所有窗口,可以选择我们的桌面模式来录制脚本。
  • 由于Windows窗口在截图时需要记录分辨率,因此把窗口嵌入到IDE后大小将会被固定,无法修改。如果觉得嵌入后窗口过大,可以在嵌入之前先将窗口调整至合适大小再进行嵌入。


退出Windows连接


  • 直接关闭AirtestIDE即可退出本次Windows连接,并将先前嵌入的窗口自动弹出
  • 也可以通过右上角的Disconnect current device按钮来退出窗口连接



3. 录制与编写Airtest脚本



在成功连接上Windows窗口后,就相当于我们已经连接上了一台设备,接下来可以对它进行脚本的录制与回放了。


生成截图语句


首先,touch / wait / exists / assert_exists / assert_not_exists等Airtest带有截图的语句,与在Android/iOS设备上录制并没有太大区别:



但是需要注意的是,在使用鼠标拖拽框选好想要截图的位置后,需要双击该截图区域才能完成截图,而不会在鼠标松开时自动完成截图,这也是Windows下截图的最大区别。

因此截图的步骤是:


  • 拖动鼠标框选合适的区域
  • 双击鼠标完成截图
  • 点击鼠标右键可以重新进行框选
  • Esc按钮可以退出本次截图操作


以及,在录制swipe语句时,在完成截图区域框选后,需要单击滑动终点完成语句录制。


调用Windows接口


和Android/iOS一样,Airtest也对Windows下的常用操作进行了封装,底层操作接口使用的是pywinauto库。


因此,在编写Windows应用的测试脚本时,我们可能需要查阅以下几个API文档:


一个简单的示例


为了方便演示,我们假设这个脚本没有在命令行中传入参数,而是在脚本里使用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)
复制代码


输入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}")
复制代码


请大家根据实际需求,查阅文档后再编写按键响应的代码。


4. 如何在运行脚本时,指定连接某个窗口



在AirtestIDE的Windows模式中,运行脚本和查看报告与其他平台并无不同:



然而,最需要注意的一点是:在AirtestIDE里连接的窗口,都是用窗口句柄连接的。窗口句柄是每个Windows窗口对象拥有的独一无二的32位无符号整数,而且每次打开窗口,这个数值都会变化


这就意味着,假如我们用某个窗口嵌入到AirtestIDE里写出了一个脚本,虽然这次可以直接运行,但是通过复制AirtestIDE里的脚本命令行的方式,是无法保证下一次还能够运行的。因为AirtestIDE里的命令行,将会有这样的参数内容--device Windows:///句柄,而下次再打开窗口,可能句柄已经发生了变化。


因此,我们也可以不使用句柄,而是通过其他的方式来连接窗口。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.*
复制代码


5. Poco支持



接入了Poco-SDK的Windows窗口


有一些Windows-app已经接入了Poco(例如Unity游戏窗口),我们同样能够使用AirtestIDE来方便地查看和选中UI节点。但是在使用这个功能前,需要事先告诉AirtestIDE这个Windows窗口所在位置以及窗口大小。


在“选项”-“设置”-“Poco”,选择“Windows Content Area Rect”,框选窗口主画面后双击确认(右键/esc可取消),随后即可开始使用Poco相关功能了,如图所示:



Poco-Windows支持


针对Windows窗口的Poco支持,我们正在完善文档和功能,敬请期待。

相关文章
|
1月前
|
敏捷开发 测试技术 持续交付
探索自动化测试在敏捷开发中的应用与挑战
本文深入探讨了自动化测试在现代软件开发流程,特别是敏捷开发环境中的重要作用和面临的挑战。通过分析自动化测试的基本原理、实施策略以及在实际项目中的应用案例,揭示了其在提高软件质量和加速产品交付方面的巨大潜力。同时,文章也指出了自动化测试实施过程中可能遇到的技术难题、成本考量及团队协作问题,并提出了相应的解决策略,为软件开发团队提供了有价值的参考和指导。
|
15天前
|
Java 测试技术 数据安全/隐私保护
软件测试中的自动化策略与工具应用
在软件开发的快速迭代中,自动化测试以其高效、稳定的特点成为了质量保证的重要手段。本文将深入探讨自动化测试的核心概念、常见工具的应用,以及如何设计有效的自动化测试策略,旨在为读者提供一套完整的自动化测试解决方案,帮助团队提升测试效率和软件质量。
|
9天前
|
安全 Ubuntu Linux
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
32 9
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
|
11天前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
56 13
|
28天前
|
jenkins 测试技术 持续交付
探索自动化测试在持续集成中的应用与挑战
本文深入探讨了自动化测试在现代软件开发流程,特别是持续集成(CI)环境中的关键作用。通过分析自动化测试的优势、实施策略以及面临的主要挑战,旨在为开发团队提供实用的指导和建议。文章不仅概述了自动化测试的基本原理和最佳实践,还详细讨论了如何克服实施过程中遇到的技术难题和管理障碍,以实现更高效、更可靠的软件交付。
|
21天前
|
机器学习/深度学习 人工智能 测试技术
探索自动化测试框架在软件开发中的应用与挑战##
本文将深入探讨自动化测试框架在现代软件开发过程中的应用,分析其优势与面临的挑战。通过具体案例分析,揭示如何有效整合自动化测试以提升软件质量和开发效率。 ##
|
17天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
46 1
|
28天前
|
敏捷开发 监控 jenkins
探索自动化测试框架在敏捷开发中的应用与优化##
本文深入探讨了自动化测试框架在现代敏捷软件开发流程中的关键作用,分析了其面临的挑战及优化策略。通过对比传统测试方法,阐述了自动化测试如何加速软件迭代周期,提升产品质量,并针对实施过程中的常见问题提出了解决方案。旨在为读者提供一套高效、可扩展的自动化测试实践指南。 ##
41 9
|
25天前
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
28 4
|
23天前
|
监控 JavaScript 前端开发
如何在实际应用中测试和比较React和Vue的性能?
总之,通过多种方法的综合运用,可以相对客观地比较 React 和 Vue 在实际应用中的性能表现,为项目的选择和优化提供有力的依据。
31 1