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

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

相关推荐
Xzh04231 天前
前后端学习的交界
java·ajax·maven·axios·测试
程序员二黑2 天前
Selenium元素定位总失败?这8种定位策略你必须掌握
单元测试·测试·ab测试
程序员二黑3 天前
自动化测试入门:从零开始搭建你的第一个WebUI项目
单元测试·测试·ab测试
从前慢,现在也慢4 天前
(3)Bug篇
学习·bug·测试
霍格沃兹_测试7 天前
软件测试 | 测试开发 | 一文带你了解K8S容器编排(上)
测试
mzhan0177 天前
Linux: network: 拔插网线 interface down/up测试的痛点
linux·服务器·测试·破坏性测试
昵称为空C7 天前
Jmeter 性能测试利器-1(入门指南)
后端·测试
漫谈测试8 天前
链路分析在性能测试各阶段的应用及优势
测试
蛋仔聊测试9 天前
Playwright 文件上传与下载完成判断全指南
python·测试