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

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

相关推荐
北京_宏哥1 小时前
🔥《刚刚问世》系列初窥篇-Java+Playwright自动化测试-19- 操作鼠标悬停(详细教程)
java·前端·测试
康谋自动驾驶21 小时前
康谋方案 | 高精LiDAR+神经渲染3DGS的完美融合实践
数据采集·测试·雷达·仿真·建模
大话性能1 天前
Python中dict遍历,让你的编程更高效
测试
雪球工程师团队2 天前
让 Bug 自动“蒸发”!我们造了个 AI 程序员同事
前端·ai编程·测试
大话性能3 天前
Mysql 百万级数据迁移实战笔记
测试
乾巫宇宙国监察特使3 天前
Python的设计模式
python·测试
半路下车4 天前
【Harmony OS 5】HarmonyOS应用测试进阶
测试·harmonyos
智云软件测评服务4 天前
软件功能测试目的是啥?如何通过测试用例确保产品达标?
测试·实际·预期
Sheeep6 天前
学习Pytest + Hypothesis——能帮你发现你自己都没想到的 bug
python·测试
大话性能6 天前
5分钟彻底搞定python异常处理
测试