『App自动化测试之Appium应用篇』| 元素定位工具uiautomatorviewer从简介、特点、启动到使用的完整过程

简介: 『App自动化测试之Appium应用篇』| 元素定位工具uiautomatorviewer从简介、特点、启动到使用的完整过程

1 uiautomatorviewer简介

  • 之前文章说明了Appium Inspector的定位使用方法;
  • uiautomatorviewer是另一种定位工具;
  • uiautomatorviewerandroid-sdk自带的元素定位工具;
  • 它是通过截屏分析XML布局文件方式,来提供控件信息的查看服务。

2 uiautomatorviewer特点

  • uiautomatorviewerAppium Inspector有着明显的区别;
  • Appium Inspector功能相对比较强大;
  • uiautomatorviewer只能用于安卓系统;
  • 另外uiautomatorviewer只能用于元素定位,不支持通过该工具操作APP,也不支持录制功能等。

3 uiautomatorviewer启用

  • uiautomatorviewer位于SDK目录下的tools\目录下;
  • 比如我的是:D:\android-sdk-windows\tools
    在这里插入图片描述
  • 双击uiautomatorviewer.bat进行启动即可:
    在这里插入图片描述

    4 Work Bar

  • Work Bar即工作栏,工作栏中有4个按钮,如图所示:
    在这里插入图片描述

  • 从左到右依次为:

图标 名称 说明
1 Open 打开已保存的布局
2 Device Screenshot(uiautomator dump) 获取详细布局
3 Device Screenshot with Cpmpressed Hierarchy (uiautomator dump) 获取简介布局
4 Save 保存布局
  • 其中4保存时将保存两个文件,一个是图片,一个是.uix文件;
    在这里插入图片描述
  • 可以查看图片显示:
    在这里插入图片描述
  • 也可以查看XML格式内容:
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<hierarchy rotation="0">
    <node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.launcher3" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][768,1184]">
        <node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.android.launcher3" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][768,1184]">
            <node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.android.launcher3" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][768,1184]">
                <node index="0" text="" resource-id="com.android.launcher3:id/launcher" class="android.widget.FrameLayout" package="com.android.launcher3" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][768,1184]">
                    <node index="0" text="" resource-id="com.android.launcher3:id/drag_layer" class="android.widget.FrameLayout" package="com.android.launcher3" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][768,1184]">
                        <node index="0" text="" resource-id="com.android.launcher3:id/workspace" class="com.android.launcher3.Workspace" package="com.android.launcher3" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" bounds="[0,0][768,1184]">
                            <node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.android.launcher3" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" bounds="[8,184][760,976]">
                                <node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.android.launcher3" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[8,184][760,976]">
                                    <node index="0" text="QQi" resource-id="" class="android.widget.TextView" package="com.android.launcher3" content-desc="QQi" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" bounds="[8,184][196,382]" />
                                    <node index="1" text="Settings" resource-id="" class="android.widget.TextView" package="com.android.launcher3" content-desc="Settings" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" bounds="[384,778][572,976]" /></node>
                                <node index="1" text="" resource-id="" class="android.view.View" package="com.android.launcher3" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[8,184][220,406]" /></node>
                        </node>
                        <node index="1" text="" resource-id="com.android.launcher3:id/search_drop_target_bar" class="android.widget.FrameLayout" package="com.android.launcher3" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,48][768,184]">
                            <node index="0" text="" resource-id="" class="android.appwidget.AppWidgetHostView" package="com.android.launcher3" content-desc="Search" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,48][768,184]">
                                <node index="0" text="" resource-id="" class="android.widget.RelativeLayout" package="com.android.quicksearchbox" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,48][768,184]">
                                    <node index="0" text="" resource-id="com.android.quicksearchbox:id/search_plate" class="android.widget.LinearLayout" package="com.android.quicksearchbox" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,48][768,184]">
                                        <node NAF="true" index="0" text="" resource-id="com.android.quicksearchbox:id/search_icon" class="android.widget.ImageView" package="com.android.quicksearchbox" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[19,68][115,164]" />
                                        <node NAF="true" index="1" text="" resource-id="com.android.quicksearchbox:id/search_widget_text" class="android.widget.TextView" package="com.android.quicksearchbox" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[115,79][740,153]" /></node>
                                </node>
                            </node>
                        </node>
                        <node index="3" text="" resource-id="com.android.launcher3:id/page_indicator" class="android.widget.LinearLayout" package="com.android.launcher3" content-desc="Home screen 2 of 2, Settings" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[360,992][408,1016]">
                            <node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.launcher3" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[360,992][384,1016]">
                                <node index="1" text="" resource-id="com.android.launcher3:id/inactive" class="android.widget.ImageView" package="com.android.launcher3" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[360,992][384,1016]" /></node>
                            <node index="1" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.launcher3" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[384,992][408,1016]">
                                <node index="0" text="" resource-id="com.android.launcher3:id/active" class="android.widget.ImageView" package="com.android.launcher3" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[384,992][408,1016]" /></node>
                        </node>
                        <node index="4" text="" resource-id="com.android.launcher3:id/hotseat" class="android.widget.FrameLayout" package="com.android.launcher3" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,1016][768,1184]">
                            <node index="0" text="" resource-id="com.android.launcher3:id/layout" class="android.view.ViewGroup" package="com.android.launcher3" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" bounds="[0,1016][768,1184]">
                                <node index="0" text="" resource-id="" class="android.view.View" package="com.android.launcher3" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[24,1016][192,1184]" />
                                <node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.android.launcher3" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[24,1016][768,1184]">
                                    <node index="0" text="Phone" resource-id="" class="android.widget.TextView" package="com.android.launcher3" content-desc="Phone" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" bounds="[29,1022][163,1178]" />
                                    <node index="1" text="Contacts" resource-id="" class="android.widget.TextView" package="com.android.launcher3" content-desc="Contacts" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" bounds="[173,1022][307,1178]" />
                                    <node index="2" text="" resource-id="" class="android.widget.TextView" package="com.android.launcher3" content-desc="Apps" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" bounds="[317,1022][451,1178]" />
                                    <node index="3" text="Messaging" resource-id="" class="android.widget.TextView" package="com.android.launcher3" content-desc="Messaging" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" bounds="[461,1022][595,1178]" />
                                    <node index="4" text="Browser" resource-id="" class="android.widget.TextView" package="com.android.launcher3" content-desc="Browser" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" bounds="[605,1022][739,1178]" /></node>
                            </node>
                        </node>
                    </node>
                </node>
            </node>
        </node>
    </node>
</hierarchy>
  • 其中2会显示全部布局;
  • 其中3只显示部分有用的控件布局。

    5 Screenshot

  • screenshot是截图区域,在图中的左侧部分;
  • 主要是显示当前屏幕的布局图片:
    在这里插入图片描述

6 控件布局

  • 控件布局内容主要在右上方显示,以XML格式展示;
    在这里插入图片描述

    7 控件属性

  • 控件属性显示在右下方,当点击一个控件时,将会在这显示其属性信息:
    在这里插入图片描述

    8 连接设备

  • 直接点击工作栏中的第二个或第三个按钮即可连接到设备;
  • 我们这里点击的是第二个按钮Device Screenshot
    在这里插入图片描述

9 Error while obtaining UI问题排查

  • 当我们点击第二个按钮Device Screenshot时出现以下界面:
    在这里插入图片描述
  • 这个说明报错了,没有连接上,那我们看下详细信息,点击【Details】:
Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't exist!
  • 大概意思是Remote object doesn't exist,就是说已经存在了一个连接,那我们就需要断开已经连接的才行;
  • 我们检查发现使用了Appium-Inspector已经连接了,我们点击【×】断开这个会话连接:

在这里插入图片描述

  • 重新再连接就可以使用uiautomatorviewer连接上了。
目录
相关文章
|
20天前
|
Java 测试技术 数据安全/隐私保护
软件测试中的自动化策略与工具应用
在软件开发的快速迭代中,自动化测试以其高效、稳定的特点成为了质量保证的重要手段。本文将深入探讨自动化测试的核心概念、常见工具的应用,以及如何设计有效的自动化测试策略,旨在为读者提供一套完整的自动化测试解决方案,帮助团队提升测试效率和软件质量。
|
13天前
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
92 17
Selenium:强大的 Web 自动化测试工具
|
18天前
|
运维 Kubernetes Devops
自动化运维:从脚本到工具的演进之旅
在数字化浪潮中,自动化运维成为提升效率、保障系统稳定的关键。本文将探索自动化运维的发展脉络,从基础的Shell脚本编写到复杂的自动化工具应用,揭示这一技术变革如何重塑IT运维领域。我们将通过实际案例,展示自动化运维在简化工作流程、提高响应速度和降低人为错误中的重要作用。无论你是初学者还是资深专家,这篇文章都将为你提供宝贵的洞见和实用的技巧。
|
25天前
|
机器学习/深度学习 人工智能 测试技术
探索自动化测试框架在软件开发中的应用与挑战##
本文将深入探讨自动化测试框架在现代软件开发过程中的应用,分析其优势与面临的挑战。通过具体案例分析,揭示如何有效整合自动化测试以提升软件质量和开发效率。 ##
|
28天前
|
机器学习/深度学习 人工智能 运维
自动化运维之路:从脚本到工具的演进
在IT运维领域,效率和准确性是衡量工作成效的关键指标。随着技术的发展,自动化运维逐渐成为提升这两个指标的重要手段。本文将带领读者了解自动化运维的演变历程,从最初的简单脚本编写到现今复杂的自动化工具应用,展示如何通过技术提升运维效率。文章不仅介绍理论和实践案例,还提供了代码示例,帮助读者理解自动化运维的实际应用场景。
|
1月前
|
JavaScript 前端开发 开发者
探索 DrissionPage: 强大的Python网页自动化工具
DrissionPage 是一个基于 Python 的网页自动化工具,结合了浏览器自动化的便利性和 requests 库的高效率。它提供三种页面对象:ChromiumPage、WebPage 和 SessionPage,分别适用于不同的使用场景,帮助开发者高效完成网页自动化任务。
129 4
|
23天前
|
Java 测试技术 API
软件测试中的自动化测试框架选择与应用##
在快速迭代的软件开发周期中,选择合适的自动化测试框架对于提高软件质量和开发效率至关重要。本文探讨了当前流行的几种自动化测试框架的特点和适用场景,旨在为软件开发团队提供决策依据。 ##
|
25天前
|
机器学习/深度学习 人工智能 安全
探索AI在软件工程中的最新应用:自动化测试与代码审查
探索AI在软件工程中的最新应用:自动化测试与代码审查
|
2月前
|
Java 测试技术 C#
自动化测试之美:从Selenium到Appium
【10月更文挑战第3天】在软件开发的海洋中,自动化测试如同一艘航船,引领着质量保证的方向。本文将带你领略自动化测试的魅力,从Web端的Selenium到移动端的Appium,我们将一探究竟,看看这些工具如何帮助我们高效地进行软件测试。你将了解到,自动化测试不仅仅是技术的展示,更是一种提升开发效率和产品质量的智慧选择。让我们一起启航,探索自动化测试的世界!
|
2月前
|
Web App开发 IDE 测试技术
自动化测试的利器:Selenium 框架深度解析
【10月更文挑战第2天】在软件开发的海洋中,自动化测试犹如一艘救生艇,让质量保证的过程更加高效与精准。本文将深入探索Selenium这一强大的自动化测试框架,从其架构到实际应用,带领读者领略自动化测试的魅力和力量。通过直观的示例和清晰的步骤,我们将一起学习如何利用Selenium来提升软件测试的效率和覆盖率。
下一篇
DataWorks