zoukankan      html  css  js  c++  java
  • 【AirTest自学】在Android手机上进行测试(转)

    参考链接:1.2 在Android手机上进行测试

     ==========================================================================================================

        写在前面:

         使用计算器和芒果TV的app自己练手做了 一个简单的数据页面

    ========================================================================================================== 

    # -*- encoding=utf8 -*-
    __author__ = "pc06"
    
    from airtest.core.api import *
    
    # 初始化Poco,非常重要!
    from poco.drivers.android.uiautomation import AndroidUiautomationPoco
    poco = AndroidUiautomationPoco()
    
    auto_setup(__file__)
    
    # 启动计算器
    #start_app("com.bbk.launcher2")
    
    poco("计算器").child("com.bbk.launcher2:id/item_icon").click()
    
    poco("com.android.bbkcalculator:id/clear").click()
    poco("com.android.bbkcalculator:id/digit1").click()
    poco("com.android.bbkcalculator:id/plus").click()
    poco("com.android.bbkcalculator:id/digit2").click()
    poco("com.android.bbkcalculator:id/equal").click()
    
    result = poco('com.android.bbkcalculator:id/input_edit').get_text()
    assert_equal(result, '3', '1+2=3 ^^')
    

      

    1.2 在Android手机上进行测试

    1. 连接Android手机

    关于Android手机的连接方法,可以查阅我们的设备连接文档,若在连接过程中遇到问题请查阅FAQ获取更多帮助。

    在成功连上手机后(也就是说,在AirtestIDE中必须要能够顺利看到手机画面和操作手机,才算是连接成功),我们就可以开始顺利地编写脚本内容了。

    指定运行某台手机

    假设我们已经熟练掌握连接手机的方法,并且写出了一个简单的脚本后,现在我们迫不及待地想要让脚本在手机上跑起来了,应该怎么做呢?

    首先,假如你使用了AndroidIDE,现在想要让当前脚本在当前连接的手机上运行的话,只需要轻点“运行”按钮,或者按下快捷键F5,就可以看到脚本开始运行了。

    其次,在AirtestIDE中点下运行按钮时,下方的log窗口会打印出一个脚本执行的命令行,类似这样:

    "D:AirtestIDEAirtestIDE" runner "untitled.air"  --device Android://127.0.0.1:5037/F8UDU16409004135 --log "D:log"
    

    关于命令行执行脚本的细节,请参阅文档的脚本运行章节。在这里我们只需要重点关注--device Android://127.0.0.1:5037/F8UDU16409004135这个参数,它将我们想要指定的本机连接的序列号为F8UDU16409004135的手机传给了Airtest,让它明白我们需要初始化这台手机。

    在连接串Android://<adbhost[localhost]>:<adbport[5037]>/<serialno>里, adbhost是adb server所在主机的ip,adb port默认是5037,serialno是android手机的序列号。更多adb的方面的内容请参考文档developer.google

    最后,假如我们在命令行运行脚本时并没有指定手机,我们希望在脚本内通过代码来连接手机,可以使用connect_device接口:

    from airtest.core.api import connect_device
    # 传入连接串
    dev = connect_device('Android://<adbhost[localhost]>:<adbport[5037]>/<serialno>')
    

    多机协作

    在我们编写的脚本里,支持同时连接多台手机,来编写一个“多机协作”脚本,例如让两台手机登录同一个APP并相互“添加好友”。

    假如我们现在正在使用AirtestIDE编写脚本,同时连上多台手机,在运行脚本的时候AirtestIDE将会自动添加多个--device参数,把当前连接的手机都告诉脚本,无需其他额外操作。

    否则的话,可以直接在脚本里使用多个上述的connect_device语句,分别传入手机连接串信息即可。

    from airtest.core.api import connect_device
    dev1 = connect_dev("Android://127.0.0.1:5037/serialno1")  # 连上第一台手机
    dev2 = connect_dev("Android://127.0.0.1:5037/serialno2")  # 第二台手机
    
    # 此时设备列表为[dev1, dev2],传入数字0切换当前操作的手机到第1台
    set_current(0)
    
    # 切换当前操作的手机到序列号为serialno2的手机
    set_current("serialno2")
    

    2. 手机设备的相关操作

    我们在Android设备上进行测试时,还可能会需要获取部分设备/App相关的信息,或是执行ADB指令并获取输出结果。在Airtest中,我们除了一些常见接口之外,还封装了不少Android独有的接口来方便脚本在Android平台上运行。

    例如,我们可能会希望在脚本开始的时候,先将待测APP启动:

    from airtest.core.api import *
    start_app('package_name')
    

    在这段示例代码中使用的start_app接口是平台通用的接口,也就是说,不仅仅在Android上可以用来启动对应的APP,在WindowsiOS平台上也可以用这个接口来启动对应的应用程序,具体支持的平台信息可以通过查阅start_app接口文档里的Platforms字段来获取。

    在这里我们只需要使用from airtest.core.api import *这行代码来将airtest.core.api中定义的API引入,即可使用Airtest封装好的常用API了。

    注意: AirtestIDE中新建脚本时会自动添加这一行,请不要删除,否则airtest的api将不能使用!

    Android设备接口

    在上一段教程中我们提到过了可以使用connect_device来连接手机并获取到连接后的Device对象,我们也可以通过device()接口获取到当前操作的Device对象进行操作。

    接下来的第二个例子是,假如我们想要列出当前已连接的Android手机设备上所有已安装的APP列表,我们可以这样写:

    # 获取当前连接中的手机
    dev = device()
    # 打印出app列表
    print(dev.list_app())
    

    例子中所使用到的list_appairtest.core.android.android中,设备对象Android的独有接口,我们还封装了不少常用的安卓操作可供调用,例如install_appget_top_activity()等,具体可以查阅airtest.core.android.android文档

    ADB指令调用

    Android设备的测试脚本中,有时候我们需要输入一些ADB指令,如果在普通的Python脚本中想要调用ADB指令,也许需要用到subprocess等模块才能运行指令。

    但是在Airtest Project的脚本中,调用ADB指令是非常简单的事情:

    # 对当前设备执行指令 adb shell ls
    print(shell("ls"))
    
    # 对特定设备执行adb指令
    dev = connect_device("Android:///device1")
    dev.shell("ls")
    
    # 切换到某台设备,执行adb指令
    set_current(0)
    shell("ls")
    

    3. 测试Android原生应用

    poco支持直接对任何Android原生应用(非游戏引擎、非webview)进行UI层次结构识别,用法上与poco在其他平台上一模一样。

    基于webview的应用比较特殊(如微信小程序或浏览器),请见webview应用使用poco指引

    准备

    在AirtestIDE的Poco Assistant面板中选择Android模式,此时会自动向手机里安装 PocoService.apk,以及对应的test apk,并自动启动PocoService,这个是用来自动抓取 Android上界面层次结构的Service,稍等片刻就可以在AirtestIDE界面中看到UI层次结构。 点击任意节点可以Log面板中看到其所有属性并在设备画面中框出对应位置。

    以上即准备好了Android原生应用测试的开发环境,跟着下面的例子即可开始一个最简单的测试。

    例子

    点这里下载示例App(calculator),并事先将此App安装到手机上。

    首先必须初始化poco实例,才能使用poco实例的方法进行对象选择和操作。

    下面的例子演示最简单的功能,点击calculator的界面,实现一个1+1=2的运算验证。 这只是一个简单的例子,更多的poco用法和例子请见poco tutorial

    from poco.drivers.android.uiautomation import AndroidUiautomationPoco
    
    poco = AndroidUiautomationPoco()
    
    poco('com.google.android.calculator:id/digit_1').click()
    poco('com.google.android.calculator:id/op_add').click()
    poco('com.google.android.calculator:id/digit_1').click()
    poco('com.google.android.calculator:id/eq').click()
    
    result = poco('com.google.android.calculator:id/formula').get_text()
    self.assertEqual(result, '2', '1+1=2 ^^')
    

    如果连接了多个Android设备,则初始化时需要手动指定设备,不然无法识别需要控制哪一台。 使用airtest.core.api.connect_device 连接指定设备,示例见上一章节。

    使用connect_device连接好指定设备后,会返回一个Device对象,将这个对象传入AndroidUiautomationPoco第一个参数里进行poco的初始化,接下来使用此poco 实例将会获取所指定的设备的UI和对其进行操作。

    from airtest.core.api import connect_device
    from poco.drivers.android.uiautomation import AndroidUiautomationPoco
    
    dev = connect_device('Android://<adbhost[localhost]>:<adbport[5037]>/<serialno>')
    poco = AndroidUiautomationPoco(dev)
    # ...
    

    注意事项

    需要Android SDK API version ≥ 19,即Android 4.4及以上,越高版本兼容性越好。

    在Android原生应用上使用poco不需要配置任何依赖,只需手机处于usb调试模式即可(部分手机需要连同usb安装、usb模拟点击等权限一起打开,均位于开发者选项里)。在初始化poco 实例时,会自动向手机里安装PocoService.apk,如果此时弹出安装提示,请点击同意,否则poco无法使用,一共会安装两个app进去。

    如果PocoService已经装进去了并且看到了”poco service is running!”的toast,但是仍然无法运行,那可能是还需要打开额外的手机权限,看下手机里有没有其余的权限设置,参考 文档

    4. API指引

  • 相关阅读:
    luogu 1865 数论 线性素数筛法
    洛谷 2921 记忆化搜索 tarjan 基环外向树
    洛谷 1052 dp 状态压缩
    洛谷 1156 dp
    洛谷 1063 dp 区间dp
    洛谷 2409 dp 月赛题目
    洛谷1199 简单博弈 贪心
    洛谷1417 烹调方案 dp 贪心
    洛谷1387 二维dp 不是特别简略的题解 智商题
    2016 10 28考试 dp 乱搞 树状数组
  • 原文地址:https://www.cnblogs.com/conquerorren/p/12720533.html
Copyright © 2011-2022 走看看