1.2 在Android手机上进行测试

1. 连接Android手机

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

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

指定运行某台手机

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

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

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

"D:\AirtestIDE\AirtestIDE" 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指引