『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连接上了。
目录
相关文章
|
1天前
|
存储 边缘计算 安全
探索边缘计算在工业自动化中的应用
【5月更文挑战第14天】本文探讨了边缘计算在工业自动化中的应用,包括实时数据分析、预测性维护、协同制造及安全隐私保护。边缘计算通过在数据源头处理信息,实现更快响应和低延迟,促进生产效率提升、稳定性增强及安全性改善。随着技术发展,边缘计算将在工业自动化领域扮演更重要角色,推动制造业数字化转型。
|
1天前
|
传感器 监控 安全
传感器在机械自动化中的应用有哪些?
传感器在机械自动化中的应用有哪些?
19 2
|
1天前
|
JSON 监控 调度
局域网管理软件的自动化任务调度:Python 中的 APScheduler 库的应用
使用 Python 的 APScheduler 库可简化局域网管理中的自动化任务调度。APScheduler 是一个轻量级定时任务调度库,支持多种触发方式如间隔、时间、日期和 Cron 表达式。示例代码展示了如何创建每 10 秒执行一次的定时任务。在局域网管理场景中,可以利用 APScheduler 定期监控设备状态,当设备离线时自动提交数据到网站,提升管理效率。
24 0
|
1天前
|
XML 开发框架 .NET
C#/ASP.NET应用程序配置文件app.config/web.config的增、删、改操作
C#/ASP.NET应用程序配置文件app.config/web.config的增、删、改操作
12 1
|
1天前
|
Java 测试技术 持续交付
自动化测试框架选型与实战:深入探索与应用
【5月更文挑战第8天】本文探讨了自动化测试框架的选型与实战应用,强调了其在软件质量保障中的重要性。选型原则包括考虑项目需求、技术栈、可扩展性和可维护性,以及社区支持和文档。介绍了Selenium、Appium、JUnit和Pytest等常用框架,并概述了实战应用的步骤,包括明确需求、搭建环境、编写测试用例、执行测试、分析结果、维护代码和持续集成。合理选型与实践能提升测试效率,保障项目成功。
|
1天前
|
编解码 测试技术 Android开发
Appium Inspector与Weditor:移动端测试的利器
本文介绍了两款移动端自动化测试的元素定位工具:Appium Inspector和weditor。Appium Inspector是官方推荐的辅助工具,而weditor是基于Python的ATX生态工具,支持Android和iOS界面分析。weditor安装需Python 3.6以上版本,可能遇到的GBK编码问题可通过更改系统区域设置解决。它提供设备界面、元素详情和代码运行三个主要部分,便于元素定位、属性查看及交互代码执行。这两款工具对于提升开发和测试效率具有积极作用。
41 8
|
1天前
|
JSON 前端开发 JavaScript
快照测试在前端自动化测试中的应用
在前端自动化测试中,快照测试常用于检验组件渲染与布局。
|
1天前
|
缓存 移动开发 前端开发
【专栏:HTML与CSS前端技术趋势篇】HTML与CSS在PWA(Progressive Web Apps)中的应用
【4月更文挑战第30天】PWA(Progressive Web Apps)结合现代Web技术,提供接近原生应用的体验。HTML在PWA中构建页面结构和内容,响应式设计、语义化标签、Manifest文件和离线页面的创建都离不开HTML。CSS则用于定制主题样式、实现动画效果、响应式布局和管理字体图标。两者协同工作,保证PWA在不同设备和网络环境下的快速、可靠和一致性体验。随着前端技术进步,HTML与CSS在PWA中的应用将更广泛。
|
1天前
|
敏捷开发 测试技术 持续交付
探索自动化测试在敏捷开发中的应用移动应用的未来:跨平台开发与操作系统的融合
【4月更文挑战第30天】随着软件开发周期的不断缩短,传统的软件测试方法逐渐显得力不从心。本文将深入探讨自动化测试在敏捷开发环境中的关键作用,分析其如何提高测试效率、减少人力资源成本,并确保软件产品的质量与稳定性。通过案例分析,我们还将讨论实施自动化测试的最佳实践和面临的挑战,为追求高效敏捷开发的组织提供参考。
|
1天前
|
数据采集 机器学习/深度学习 人工智能
自动化测试中AI辅助技术的应用与挑战
【4月更文挑战第30天】随着人工智能(AI)技术的飞速发展,其在软件自动化测试领域的应用日益增多。本文探讨了AI辅助技术在自动化测试中的应用情况,包括智能化测试用例生成、测试执行监控、缺陷预测及测试结果分析等方面。同时,文章还分析了在融合AI技术时所面临的挑战,如数据质量要求、模型的透明度与解释性问题以及技术整合成本等,并提出了相应的解决策略。

热门文章

最新文章