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

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

相关推荐
花椒技术11 小时前
不是跑通一次 Demo:花椒 QA 怎样把真机 UI 自动化做成回归流程
ios·单元测试·测试
狂师19 小时前
UI自动化测试提效必备Skill!一套CI流水线编排 Skill 可以直接抄了...
人工智能·agent·测试
匠测AI说1 天前
Cypress 自动化全解:浏览器内运行架构、命令队列、高频 API 与项目选型指南
测试
程序员贺加贝2 天前
AI 时代 SaaS ERP 自动化测试路线:先补接口级黄金流程
测试·saas
狂师2 天前
AI 测试丨一句指令生成测试报告,带失败截图、操作录屏、Trace、日志,这套 Skill 思路可以直接抄...
人工智能·开源·测试
ClouGence3 天前
Playwright 已经很好用了,为什么我还在找更简单的自动化测试工具?
测试·敏捷开发
DsirNg4 天前
把 AI 放进一次合并请求:一个批量归档功能的交付闭环
软件工程·测试·代码审查·开发效率·pull request·ai辅助编程·需求拆解
狂师4 天前
AI 测试 | 把 UI 自动化测试执行固化成五步流程,这套AI Skill 思路可以直接抄
人工智能·agent·测试
ClouGence8 天前
自动化测试实战:手把手教你用 AI Agent 实现版本打包自动化
人工智能·ai编程·测试