UI 自动化测试:adb 调用 Intent 进入指定页面或 Shortcut 快捷方式

背景

在执行 UI 自动化测试的时候,有些时候我们需要快速到达某个界面,举个例子,例如我要测试米家里面某个已绑定设备的界面,一般的办法可能需要先进入界面,通过下拉找到卡片模拟点击才能实现,或者还有更复杂的交互,这种情况下,希望寻求一种方法可以直接进入。

思路

一般来说进入一个界面只是发送一个 Intent 到我们对应的应用,可能需要附带一些参数,如果我们搞清楚这个设备页面对应的启动 Intent,以及参数的格式,就可以通过 adb 发送这个 Intent 的方式来启动这个页面。

那么问题来了,如何找到这个设备呢?

首先我们发现这个设备卡片是支持直接长按然后就可创建一个桌面快捷方式 (Shortcut),然后通过这个快捷方式的入口就可以直接进入卡片。

所以可以合理推断,这个 Shortcut 上面应该包含有我们需要的 Intent 规格信息(无非就是 Intent 的 Activity 名字以及 extra 参数)。

找到这个 Shortcut 对应的 Intent 规格

研究了一下,通过 adb 命令可以把 shortcut 的信息刷出来:

参考:developer.android.com/studio/comm...

参考:mabin004.github.io/2018/08/02/...

复制代码
adb shell dumpsys shorcut

将输出转存到一个文本文件,然后进行分析,查找米家应用下有哪些 shortcut,大概会有这个内容:

ini 复制代码
  Package: com.xiaomi.smarthome  UID: 10244
    Calls: 0
    Last known FG: 665574970
    Last reset: [1694585001674] 2023-09-13 14:03:21

    PackageInfo:
      IsShadow: false (installed)
      Version: 77107
      Backup Allowed: false
      Last package update time: 1685367768912

    Shortcuts:
      ShortcutInfo {id=热水器, flags=0x8a [PinIc-fStr]
        packageName=com.xiaomi.smarthome
        activity=ComponentInfo{com.xiaomi.smarthome/com.xiaomi.smarthome.SmartHomeMainActivity}
        shortLabel=热水器, resId=0[null]
        longLabel=null, resId=0[null]
        disabledMessage=null, resId=0[null]
        disabledReason=[Not disabled]
        categories=null
        persons=null
        icon=null
        rank=0, timestamp=1694590150558
        intents=[Intent { act=com.xiaomi.smarthome.action.viewdevice cmp=com.xiaomi.smarthome/.device.utils.DeviceLauncher2 }/PersistableBundle[{source_tag=short_cut, device_id=********, timestamp=1694590150390, device_mac=??:??:??:??:??:??, from_main_activity=true, user_model=cuco.plug.cp2d}]]
        extras=null
        iconRes=0[null], bitmapPath=/data/system_ce/0/shortcut_service/bitmaps/com.xiaomi.smarthome/1694590150576.png, iconUri=null}
        bitmap size=19309
    Total bitmap size: 19309 (19.31 kB)

这里就可以看到我们刚才创建的热水器 shortcut 了,可以看到,下面这个 Intent 内容就是我们要找的调用方式。

ruby 复制代码
intents=[Intent { act=com.xiaomi.smarthome.action.viewdevice cmp=com.xiaomi.smarthome/.device.utils.DeviceLauncher2 }/PersistableBundle[{source_tag=short_cut, device_id=********, timestamp=1694590150390, device_mac=??:??:??:??:??:??, from_main_activity=true, user_model=cuco.plug.cp2d}]]

最后,转换成 adb shell am 命令来启动这个设备试试:

ruby 复制代码
adb shell am start -n com.xiaomi.smarthome/com.xiaomi.smarthome.device.utils.DeviceLauncher2 -a com.xiaomi.smarthome.action.viewdevice -es source_tag short_cut --es device_id ******** --es device_mac ??:??:??:??:??:?? --es user_model cuco.plug.cp2d --es from_main_activity true -es timestamp 1694590150390

大功告成,因此后面有类似的应用场景,也可以参考这种思路。

相关推荐
老神在在0012 天前
保姆级教程:Pytest + Allure 接口自动化测试从 0 到 1 完整指南(含环境搭建、用例编写、报告生成、报错排坑全流程)
pycharm·pytest·测试
甜甜圈圈子3 天前
在 Linux 中使用 CAN 通信:从配置到测试与代码实现
测试
测试员周周3 天前
【AI测试功能4】别再用传统等价类设计 AI测试用例了——语义覆盖的四种变体方法
人工智能·python·测试
努力进修4 天前
抽奖系统---测试报告
测试
老神在在0015 天前
测试方法与使用场景
单元测试·测试
Maỿbe6 天前
测试的基本认知
测试
humors2217 天前
十款顶级跑分与排名软件全解析
电脑·内存·测试·cpu·gpu·笔记本·硬盘
狼爷7 天前
JMeter 全指南:从性能测试入门到架构级实战
jmeter·测试
测试员周周9 天前
【AI测试系统】第5篇:从 Archon 看 AI 工程化落地:为什么"确定性编排+AI 弹性智能"是终局?
人工智能·python·测试
EulerBlind9 天前
接口自测-1777696985
测试