深入剖析安卓布局uiautomator抓取工具原理

解决uiautomatorviewer报错:Android UI自动化调试工具故障排查指南 在Android UI自动化测试中,UI控件层级信息的获取是核心环节,它直接关系到自动化脚本的定位准确性和执行效率。其原理是通过ADB与设备端的uiautomator服务通信,执行dump命令来捕获并传输XML格式的UI结构数据。这项技术的价值在于为自动化测试提供了稳定、可编程的界面元素识别基础,广泛应用于Appium等主流测试框架。然而,在实际工程实践中,尤其是在Android 9及以上版本的真机调试时,常会遇到“Error obtaining UI hierarchy”这类报错,导致自动化流程中断。这通 阅读详情

深入剖析 uiautomator dump:为何一个 shell 命令能导出任意 App 的布局 XML?

经常android studio一些布局抓取工具其实本质上都是使用sdk下的uiautomator命令进行的抓取View数据。

先看看uiautomator命令如何使用?看看使用帮助

adb shell uiautomator -help

展示如下

adb shell uiautomator -help
Usage: uiautomator <subcommand> [options]

Available subcommands:

help: displays help message

runtest: executes UI automation tests
    runtest <class spec> [options]
    <class spec>: <JARS> < -c <CLASSES> | -e class <CLASSES> >
      <JARS>: a list of jar files containing test classes and dependencies. If
        the path is relative, it's assumed to be under /data/local/tmp. Use
        absolute path if the file is elsewhere. Multiple files can be
        specified, separated by space.
      <CLASSES>: a list of test class names to run, separated by comma. To
        a single method, use TestClass#testMethod format. The -e or -c option
        may be repeated. This option is not required and if not provided then
        all the tests in provided jars will be run automatically.
    options:
      --nohup: trap SIG_HUP, so test won't terminate even if parent process
               is terminated, e.g. USB is disconnected.
      -e debug [true|false]: wait for debugger to connect before starting.
      -e runner [CLASS]: use specified test runner class instead. If
        unspecified, framework default runner will be used.
      -e <NAME> <VALUE>: other name-value pairs to be passed to test classes.
        May be repeated.
      -e outputFormat simple | -s: enabled less verbose JUnit style output.

dump: creates an XML dump of current UI hierarchy
    dump [--verbose][file]
      [--compressed]: dumps compressed layout information.
      [file]: the location where the dumped XML should be stored, default is
      /sdcard/window_dump.xml

events: prints out accessibility events until terminated


平时主要使用的是dump命令来导出view的相关数据:

adb shell uiautomator dump /sdcard/demo_dump-xiaomi-wx.xml

然后再pull出这个xml导入到相关软件中,当然相关软件完全可以自己shell命令进行dump,然后展示。

本文基于 AOSP 15 frameworks/base/cmds/uiautomator 源码,逐层剖析 uiautomator dump 导出布局 XML 的完整原理。


uiautomator命令进行切入

Android 开发者几乎每天都会用到的命令:

adb shell uiautomator dump xxx.xml

执行后,当前屏幕的完整 UI 层次结构就被导出为一份 window_dump.xml 文件,包含每个控件的坐标、类名、resource-id、文本内容、可点击状态等信息。这个功能对自动化测试、UI 校验、竞品分析都至关重要。

那么问题来了:uiautomator 作为一个运行在 adbd shell 进程中的普通 Java 程序,它是如何跨越进程边界,读取到任意前台 App(比如微信、淘宝)内部 View 树的?

源码路径:

frameworks/base/cmds/uiautomator/cmds/uiautomator/


整体架构

先通过一张图俯瞰整体架构,它清晰地展示了从 shell 命令到最终 XML 文件的完整数据流:

在这里插入图片描述

整个流程分为四个核心层次:

  1. 命令行入口层 (Launcher → DumpCommand):解析用户输入的参数
  2. 连接层 (UiAutomationShellWrapper):创建 UiAutomation 实例并向系统注册
  3. SDK API 层 (android.app.UiAutomation):通过 Binder IPC 与 AccessibilityManagerService 通信
  4. 序列化层 (AccessibilityNodeInfoDumper):递归遍历 AccessibilityNodeInfo 树,用 XmlSerializer 输出 XML

Android 无障碍框架(前置知识)

在深入代码之前,必须先理解 Android 无障碍框架的核心机制。这是整个 dump 功能的地基。

在这里插入图片描述

数据如何产生:View 的自我描述

Android 中的每个 View 都有一个方法:

// frameworks/base/core/java/android/view/View.java
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
    // 填充节点的基本信息
    info.setClassName(getClass().getName());
    info.setPackageName(getContext().getPackageName());
    info.setBoundsInScreen(...);
    info.setClickable(isClickable());
    info.setEnabled(isEnabled());
    info.setContentDescription(getContentDescription());
    // ...
}

当无障碍服务被激活时,ViewRootImpl 会遍历 View 树,调用每个 View 的 onInitializeAccessibilityNodeInfo(),构建出对应的 AccessibilityNodeInfo 树。每个节点都是一个"View 的自我描述"——包含类名、坐标、文本、状态等。

数据如何传递:Binder IPC

ViewRootImpl 持有 AccessibilityManager 实例,通过 IAccessibilityInteractionConnection 这个 Binder 接口,将 View 树的 Accessibility 信息上报给系统进程中的 AccessibilityManagerService。

AccessibilityManagerService 是全局的"信息中转站"——它维护着所有窗口的 Accessibility 树,并响应无障碍服务的查询请求。


第一层:命令行入口 —— Launcher

源码位置:cmds/uiautomator/src/com/android/commands/uiautomator/Launcher.java

public class Launcher {
    public static void main(String[] args) {
        Process.setArgV0("uiautomator");  // 让 ps 显示为 "uiautomator"
        if (args.length >= 1) {
            Command command = findCommand(args[0]);
            if (command != null) {
                String[] args2 = {};
                if (args.length > 1) {
                    args2 = Arrays.copyOfRange(args, 1, args.length);
                }
                command.run(args2);
                return;
            }
        }
        HELP_COMMAND.run(args);
    }

    private static Command[] COMMANDS = new Command[] {
        HELP_COMMAND,
        new RunTestCommand(),
        new DumpCommand(),
        new EventsCommand(),
    };
}

Launcher 是一个典型的命令分发器。当你执行 uiautomator dump --windows /sdcard/ui.xml 时:

  • args[0] = "dump" → 匹配到 DumpCommand
  • 剩余的 ["--windows", "/sdcard/ui.xml"] 作为参数传递给 DumpCommand.run()

这个设计的巧妙之处在于,它让 uiautomator 这个二进制文件可以承载多种功能(dump、运行测试、注入事件),所有功能共享同一套连接机制。


第二层:连接无障碍服务 —— UiAutomationShellWrapper

源码位置:library/testrunner-src/com/android/uiautomator/core/UiAutomationShellWrapper.java

这是让 uiautomator "变身"为无障碍服务的关键代码:

public class UiAutomationShellWrapper {
    private static final String HANDLER_THREAD_NAME = "UiAutomatorHandlerThread";
    private final HandlerThread mHandlerThread = new HandlerThread(HANDLER_THREAD_NAME);
    private UiAutomation mUiAutomation;

    public void connect() {
        if (mHandlerThread.isAlive()) {
            throw new IllegalStateException("Already connected!");
        }
        mHandlerThread.start();
        // 关键:UiAutomation 内部用到的 AccessibilityInteractionClient
        // 要求主线程 Looper 已准备好。在 App 进程中系统会自动帮你做,
        // 但这里是纯 shell 进程,所以必须显式调用。
        Looper.prepareMainLooper();
        mUiAutomation = new UiAutomation(
                mHandlerThread.getLooper(),
                new UiAutomationConnection());
        mUiAutomation.connect();  // ← 真正建立连接的地方
    }

    public void setCompressedLayoutHierarchy(boolean compressed) {
        AccessibilityServiceInfo info = mUiAutomation.getServiceInfo();
        if (compressed)
            info.flags &= ~AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
        else
            info.flags |= AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
        mUiAutomation.setServiceInfo(info);
    }
}

连接建立的底层:UiAutomation.connect()

UiAutomation 是 android.app 包中的 SDK 公开 API(非 hide)。它的 connect() 方法内部做了以下事情:

  1. 通过 UiAutomationConnection 这个 Binder 代理向 AccessibilityManagerService 注册自己为伪无障碍服务
  2. 系统服务返回一个 IAccessibilityServiceClient 的 Binder 通道
  3. 此后 UiAutomation 就可以通过这个通道向系统服务查询任意窗口的 AccessibilityNodeInfo 树

"伪无障碍服务"的意思是:系统知道它是一个测试工具而非真正的无障碍服务(如 TalkBack),所以不会触发无障碍服务的标准生命周期(如 onServiceConnected),但会赋予它同等级甚至更高的查询权限。


第三层:获取根节点 —— UiAutomation

源码位置:cmds/uiautomator/src/com/android/commands/uiautomator/DumpCommand.java

@Override
public void run(String[] args) {
    File dumpFile = DEFAULT_DUMP_FILE;
    boolean verboseMode = true;
    boolean allWindows = false;

    // 解析参数
    for (String arg : args) {
        if (arg.equals("--compressed"))
            verboseMode = false;
        else if (arg.equals("--windows"))
            allWindows = true;
        else if (!arg.startsWith("-"))
            dumpFile = new File(arg);
    }

    UiAutomationShellWrapper automationWrapper = new UiAutomationShellWrapper();
    automationWrapper.connect();
    // ...
    automationWrapper.setCompressedLayoutHierarchy(!verboseMode);

    try {
        UiAutomation uiAutomation = automationWrapper.getUiAutomation();
        uiAutomation.waitForIdle(1000, 1000 * 10);  // 等待界面稳定

        if (allWindows) {
            // --windows 模式:遍历所有显示器上所有窗口
            AccessibilityServiceInfo info = uiAutomation.getServiceInfo();
            info.flags |= AccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS;
            uiAutomation.setServiceInfo(info);
            AccessibilityNodeInfoDumper.dumpWindowsToFile(
                    uiAutomation.getWindowsOnAllDisplays(), dumpFile,
                    DisplayManagerGlobal.getInstance());
        } else {
            // 默认模式:只导出当前前台窗口
            AccessibilityNodeInfo info = uiAutomation.getRootInActiveWindow();
            if (info == null) {
                System.err.println("ERROR: null root node...");
                return;
            }
            Display display = DisplayManagerGlobal.getInstance()
                .getRealDisplay(Display.DEFAULT_DISPLAY);
            int rotation = display.getRotation();
            Point size = new Point();
            display.getRealSize(size);
            AccessibilityNodeInfoDumper.dumpWindowToFile(
                info, dumpFile, rotation, size.x, size.y);
        }
    } catch (TimeoutException re) {
        System.err.println("ERROR: could not get idle state.");
    } finally {
        automationWrapper.disconnect();
    }
}

单窗口 vs 多窗口

  • 默认模式:getRootInActiveWindow() 返回当前聚焦窗口的根 AccessibilityNodeInfo,对应 XML 中只有一个 <hierarchy> 根标签
  • 多窗口模式 (--windows):设置 FLAG_RETRIEVE_INTERACTIVE_WINDOWS 后,getWindowsOnAllDisplays() 返回一个 SparseArray(按 displayId 分组),每个窗口又包含自己的 <hierarchy> 树。最终 XML 结构为 <displays> → <display> → <window> → <hierarchy> → <node>

分辨率信息的来源

导出 XML 时需要的屏幕宽度、高度和旋转角度,并非从 AccessibilityNodeInfo 获取,而是通过 DisplayManagerGlobal 直接查询硬件显示信息。这是因为 Accessibility 节点中的坐标可能被裁剪或变换,需要屏幕实际尺寸作为参考来校准。


第四层:递归遍历并序列化为 XML —— AccessibilityNodeInfoDumper

源码位置:library/core-src/com/android/uiautomator/core/AccessibilityNodeInfoDumper.java

这是整个 dump 功能的核心引擎。它接收一个 AccessibilityNodeInfo 根节点,递归遍历整棵树,用 Android 内置的 XmlSerializer 将每个节点写入 XML。

在这里插入图片描述

入口:dumpWindowToFile

public static void dumpWindowToFile(AccessibilityNodeInfo root, File dumpFile,
        int rotation, int width, int height) {
    if (root == null) return;
    final long startTime = SystemClock.uptimeMillis();
    try {
        FileWriter writer = new FileWriter(dumpFile);
        XmlSerializer serializer = Xml.newSerializer();
        StringWriter stringWriter = new StringWriter();
        serializer.setOutput(stringWriter);
        serializer.startDocument("UTF-8", true);
        serializer.startTag("", "hierarchy");
        serializer.attribute("", "rotation", Integer.toString(rotation));
        dumpNodeRec(root, serializer, 0, width, height);  // 递归入口
        serializer.endTag("", "hierarchy");
        serializer.endDocument();
        writer.write(stringWriter.toString());
        writer.close();
    } catch (IOException e) {
        Log.e(LOGTAG, "failed to dump window to file", e);
    }
    final long endTime = SystemClock.uptimeMillis();
    Log.w(LOGTAG, "Fetch time: " + (endTime - startTime) + "ms");
}

这里有一个值得注意的性能细节:先写入 StringWriter 再一次性写入文件,而不是边遍历边写文件。这样做的好处是:

  • XmlSerializer 操作的是内存中的 StringWriter,避免频繁的磁盘 I/O
  • 如果遍历过程中出错,不会产生不完整的 XML 文件
  • 代价是需要足够内存来存放整个 XML 字符串——对于复杂的 UI(几百到几千个节点),这个字符串通常在几百 KB 到几 MB.

原文参考:
https://mp.weixin.qq.com/s/O8Z4zRPFdnKCza1xZrIcEQ

Appium自动化测试:Android页面节点元素信息获取与定位策略详解 在移动应用自动化测试领域,精准定位页面元素是构建稳定测试脚本的基石。其核心原理是通过自动化框架与设备建立通信,解析应用的UI层级结构,从而获取控件的唯一标识和属性。掌握这一技术对于提升测试效率、保障应用质量具有重要价值,广泛应用于回归测试、数据抓取和自动化业务流程等场景。本文聚焦于Appium这一主流框架,深入讲解如何通过resource-id、XPath等关键属性获取Android页面节点元素信息,并结合Python脚本实战,详细解析了从环境搭建、元素定位到高级处理的全流程,帮助开发者构建稳定可靠的自动化 阅读详情

相关推荐

Android UI自动化测试:解决uiautomatorviewer InvocationTargetException报错

在Android应用自动化测试中,UI元素定位是核心环节,它依赖于稳定的工具链和正确的环境配置。Java反射机制是许多测试框架实现动态调用的基础,但当底层方法执行失败时,会抛出InvocationTargetException这类包装异常,导致工具链中断。从工程实践角度看,这通常涉及ADB连接、SDK版本兼容性、Java运行环境等多方面因素。针对Android UI自动化测试中常见的uiautomatorviewer工具报错问题,系统化的排查思路至关重要。通过分析ADB命令执行、SDK工具链版本管理以及JA

weixin_30236595的博客 303

小知识分享:adb uiautomator 命令 dump ui 树信息

之前给大家分享过一篇文章,讲述如何通过 getevent/sendevent/input 命令向 android 手机设备接收和发送操作事件,来解决自动化脚本场景的需求。其实还有一个小知...

滴水穿石,点石为金 1万+

React Native Android软键盘适配:adjustResize与adjustPan原理及实战

软键盘行为是移动应用表单交互的基础能力,其本质属于Android窗口管理机制中的布局响应策略,而非前端样式控制。理解windowSoftInputMode的三种模式(adjustResize、adjustPan、adjustUnspecified)对Activity根视图尺寸和测量流程的影响,是解决RN安卓端输入框遮挡、SafeAreaView失效、KeyboardAvoidingView失灵等高频问题的前提。adjustResize通过收缩窗口触发onMeasure重排,为RN提供可感知的尺寸变化,是兼容

weixin_30751947的博客 337

Android uiautomator dump 命令介绍

uiautomator ,google官方提供的一个ui测试工具。命令行中可以使用dump,命令获取到当前界面的UI层级并使用XML格式数据展示。(可以获取到当前界面、可以获取到当前界面、可以获取到当前界面,重要的事情说三遍,配合adb input 命令,2333,你懂的)

Lincoln 的专栏 3万+

AndroidDumpUI:android dump ui层次结构(支持动画UI)

使用android工具(Library / Android / sdk / tools / bin / uiautomatorviewer)或adb命令(adb shell uiautomator dump)转储动画页面,始终会收到错误消息:错误:无法获取空闲状态。 要解决此问题,请从下载google测试项目,然后添加DumpUI.java来捕获UI层次结构。 如何使用它? 亚行安装基本UIAutomator.apk ./dumpUI.sh 您将在当前目录中获得window_dump.png / window_dump.uix 通过uiautomatorviewer导入window_dump.png / window_dump.uix

AI与运筹学赋能:混合动力公交调度优化算法实战解析

组合优化是运筹学与计算机科学交叉的核心领域,旨在从海量可行方案中寻找最优解,其原理在于通过定义目标函数与约束条件,将复杂现实问题转化为可计算的数学模型。该技术的核心价值在于解决资源受限下的高效分配问题,广泛应用于物流、交通、生产调度等场景。在智慧交通领域,混合动力公交车辆调度正是一个典型的组合优化问题,涉及车辆、班次、充电桩等多重资源与时空约束。本文聚焦于通过贪婪启发式与模拟退火元启发式算法,求解大规模公交网络下的车辆调度与能耗优化方案,旨在实现总能源成本最小化。其中,模拟退火算法通过引入概率性接受劣解的策

weixin_42497762的博客 406

用一条命令导出 uiautomator dump 内容

解决了一般先导出到手机存储,再pull到本地的问题。内容直接输出到本地shell。

unxeer的博客 1187

【天线与电波传播】电波传播部分 第7章 电波传播的基础知识3

菲涅尔区与菲涅尔带的基本知识

Chen59_2328的博客 1601

adb shell uiautomator dump没有返回

adb shell uiautomator dump是ADB获取当前屏幕控件信息的命令,有时候执行命令返回是空, 如下所示: 换一部手机执行,又有数据返回,猜想可能是手机的问题 把有问题那台手机关闭开发者模式,再重新打开,再去执行命令:adb shell uiautomator dump 发现问题成功解决: ...

weixin_38365035的博客 2234

原形网络(Prototypical Networks)基于PyTorch的实现

我在Jay2coomzz的基础上修改了数据处理方式和evaluation_model()方法,作为初学者若有不当之处恳请大家批评指正,原文链接如下: https://blog.youkuaiyun.com/weixin_38471579/article/details/102631018 数据集和源码链接将放到评论区 文章目录1 数据集一个简单的数据集介绍数据集处理2 搭建网络CNNProtonets 1 数据集 一个简单的数据集介绍 Omniglot数据集一共包含1623 类手写体,每一类中包含20 个样本。其中.

weixin_43872532的博客 6636

Stable Diffusion跑图总爆显存?别急着换显卡,试试这个PYTORCH_CUDA_ALLOC_CONF参数调优

本文深入解析了Stable Diffusion运行中常见的显存不足问题,特别是由显存碎片化导致的假性OOM现象。通过详细讲解PYTORCH_CUDA_ALLOC_CONF参数中的max_split_size_mb设置技巧,提供了一套完整的显存优化方案,帮助用户在无需升级硬件的情况下显著提升AI绘画的稳定性与效率。

weixin_42524100的博客 347

uiautomator获取不到动态界面的缘由

这几天查看了下源码发现,

doctorq 2万+

超详细流式细胞术全流程解析:从样本制备到结果分析全攻略

流式细胞术(Flow Cytometry)是现代生物学和医学研究中不可或缺的高通量分析技术,可实现对细胞表型、功能状态、细胞周期等多维度参数的快速检测。本文将从实验全流程出发,详解样本制备、上机操作、参数设置及结果处理的核心要点,帮助科研人员精准掌握流式实验关键技术。

good_rrrrr的博客 3868

Android自动化测试入门:uiautomator2环境搭建与核心API详解

UI自动化测试是移动应用质量保障的关键技术,它通过模拟用户操作来验证应用功能。其核心原理是基于对应用界面元素的识别与操控,实现测试脚本的自动化执行。这项技术的价值在于显著提升测试效率、覆盖率和可重复性,尤其适用于回归测试、兼容性测试等重复性高的场景。在Android生态中,uiautomator2作为对官方框架的增强封装,凭借其基于Python的易用性和与系统底层服务直接通信的稳定性,成为自动化测试和脚本化操作的热门选择。它通过部署atx-agent守护进程,构建了PC端与设备端的高效通信架构,支持USB与

weixin_30788619的博客 427

Android System UI 深度解析:从架构演进到车载 / TV 场景的全维度定制

本文全面解析 Android System UI 的架构设计、功能演进及场景化定制,揭示其作为安卓系统核心交互层的技术特性与生态价值。

学无止境 1579

【openwrt-21.02】T750 openwrt 双系统说明及切换方法

高度集成的 T750 平台大幅减少组件数量,为产品设计者提供更小的尺寸和更低的功耗。T750 采用先进的 7nm 制程,高度集成 5G 调制解调器和四核 Arm CPU,提供较强的功能和配置,设备制造商得以打造精巧的高性能 CPE 产品,如固定无线接入(FWA)路由器和移动热点。3. preloader 加载并启动 A 系统,若 A 系统的任一启动阶段加载失败,preloader 将重新加载并启动 A 系统 3 次,若 3 次均失败,则自动切换至 B 系统,加载并启动 B 系统。A/B 系统切换流程如下。

wgl307293845的博客 1416

ADB设备未识别诊断全指南:从List of devices attached到真机连接

ADB设备连接是Android、鸿蒙及嵌入式开发的基础能力,其核心在于USB协议握手、驱动加载、系统服务启动与SELinux策略协同。当`adb devices`仅显示'List of devices attached'而无设备列表时,本质是USB设备枚举失败或adbd服务未激活,涉及物理层(线缆/端口)、驱动层(Windows INF/udev规则)、系统层(开发者选项/ro.adb.secure)和协议层(USB描述符bInterfaceClass)四重验证。该状态常见于vivo精简调试模式、RK356

weixin_33937778的博客 339

educoder中Hive综合应用案例 — 用户搜索日志分析

Hive综合应用案例 — 用户搜索日志分析

weixin_46026136的博客 4779

【Android学习记录】工具使用

adb工具

studyForMokey的博客 1498

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Appium基础学习之 | UiAutomator启动命令dump、events

1.dump 之前已经说过dump命令的解释了,来实操感受一下它的作用。玩过Android UI 自动化的肯定都很熟悉uiautomatorviewer这个工具了,它能帮助用户定位设备界面上的元素,然后显示元素的全部信息,便于用户使用这些信息完成一些元素定位工作。但如果uiautomatorviewer发神经获取不到设备UI界面的时候,就可以找dump帮忙了,虽然麻烦点。 (1)设备或者模拟器...

雨墨轩痕 2246

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

技术分享 | App测试时常用的adb命令你都掌握了哪些呢?

本文节选自霍格沃兹测试开发学社内部教材 adb 全称为 Android Debug Bridge(Android 调试桥),是 Android SDK 中提供的用于管理 Android 模拟器或真机的工具。 adb 是一种功能强大的命令行工具,可让 PC 端与 Android 设备进行通信。adb 命令可执行各种设备操作,例如安装和调试应用。 adb组成 采用了客户端-服务器(C/S)模型,包括三个部分: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u9ciWODl-1.

软件测试小迷糊 435

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

uiautomator执行命令详解

uiautomator一般由adb shell调用,也可以在手机端使用runTime执行。使用adb shell uiautomator helper可以查看到uiautomator所有的命令 uiautomator的执行测试用例的命令如下: #adb shell uiautomator runtest $jar_name -c $test_class_or_metho...

未来来 5733

UI自动化测试定位元素工具--终极方法dump_hierarchy

使用dump_hierarchy 获取页面层级结构

weixin_41447567的博客 1447

自动化测试 uiautomator 入门

附带 UiAutomator 接口介绍:UiDevice、UiSelector、UIObject、UiCollection、UiScrollable。 脚本命令,一键编译、执行 UiAutomator 测试脚本。

qq_18669217的博客 775

手机自动化操作:uiautomator

UiAutomator框架提供了一组API,可以与设备上的UI元素进行交互,并提供了丰富的功能来执行测试用例和获取测试结果。这样,通过一步步点击操作,你就能得到各个步骤的代码。就可以形成一个完整的自动化点击代码。然后执行python -m uiautomator2 init 安装包含httprpc服务的apk到手机+atx-agent, minicap, minitouch。在右边的coding界面可以看到对应的python连接代码。Uiautomator的原理是通过查找手机上的元素定位,然后点击。

1800

了解 uiautomatorviewer 新增的 dump --compressed 功能

新版本的uiautomatorviewer工具中新增了dump --compressed功能,可以选择只获取界面中呈现在你面前的控件,非常精简。那么它是怎么做到的,是更换命令了么?还是在dump的基础上在本地做了一个优化呢?速度怎么样?我带着这些疑惑开始了源码分析之路。 下载源码 google source 配置源码环境 解压缩有项目结构如下: 用你熟悉的方式将源码配置IDE中,我用

可口可乐的博客 5391
上一篇: 系统app开发之桌面调试Launcher3 Dumpsys信息解析
下一篇: 安卓车载手机原生多屏闪黑问题分析及修复成果展示
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值