zoukankan      html  css  js  c++  java
  • 7 | 如何测试Windows应用程序

    转载:https://airtest.doc.io.netease.com/tutorial/0_automated_testing/

    7 | 如何测试Windows应用程序

    7.1 前言


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

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

    • 使用AirtestIDE对一个Windows软件窗口进行脚本录制
    • 如何调用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 连接注意事项

    • 由于在选定窗口时,桌面上可能会有不少同时打开着的其它窗口,导致选择时的绿色方框不一定能够很准确地框选到被测应用,请大家在点击选定窗口按钮之前,尽可能先把所有其它无关窗口都最小化,这样做可以让窗口选择更准确。

    • 为了防止出现异常情况,请不要选择自己的桌面、AirtestIDE软件本体。因为窗口嵌入的功能原理是,将一个Windows窗口设置为IDE的子窗口,因此如果试图连接桌面,可能会导致无法预料的异常情况发生。如果只是想测试桌面上的所有窗口,可以选择我们的桌面模式来录制脚本。

    • 由于Windows窗口在截图时需要记录分辨率,因此把窗口嵌入到IDE后大小将会被固定,无法修改。如果觉得嵌入后窗口过大,可以在嵌入之前先将窗口调整至合适大小再进行嵌入。

    7.3.5 退出Windows连接

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



    7.4 录制与编写Airtest脚本


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

    7.4.1 生成截图语句

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

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

    因此截图的步骤是:

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

    以及,在录制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里的命令行,将会有这样的参数内容--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.*
    



    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支持,我们正在完善文档和功能,敬请期待。

  • 相关阅读:
    DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践
    UVA10071 Back to High School Physics
    UVA10071 Back to High School Physics
    UVA10055 Hashmat the Brave Warrior
    UVA10055 Hashmat the Brave Warrior
    UVA458 The Decoder
    UVA458 The Decoder
    HDU2054 A == B ?
    HDU2054 A == B ?
    POJ3414 Pots
  • 原文地址:https://www.cnblogs.com/ShineLeem/p/11326197.html
Copyright © 2011-2022 走看看