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

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

相关推荐
Apifox1 天前
【测试套件】当用户说“我只想跑 P0 用例”时,我们到底在说什么
单元测试·测试·ab测试
阁老3 天前
pytest测试框架:如何确保登录模块先执行并共享登录状态
测试
_志哥_4 天前
Superpowers 技术指南:让 AI 编程助手拥有超能力
人工智能·ai编程·测试
FliPPeDround7 天前
浏览器扩展 E2E 测试的救星:vitest-environment-web-ext 让你告别繁琐配置
e2e·浏览器·测试
Apifox7 天前
Apifox 2 月更新|MCP Client 调试体验优化、测试套件持续升级、支持公用测试数据、测试报告优化
前端·后端·测试
infiniteWei7 天前
Skills、MCP、Agent 的边界与商业化定位(附项目筛选表)
人工智能·aigc·测试
洞窝技术9 天前
让AI帮我做测试用例,我来喝咖啡
ai编程·测试
洛_尘15 天前
测试6:自动化测试--概念篇(JAVA)
java·开发语言·测试
洛_尘18 天前
测试5:测试分类
测试
橘颂TA1 个月前
【测试】高效浏览器操作:基础功能与优化设置大全
c++·功能测试·职场和发展·测试·web测试