『App自动化测试之Appium应用篇』| uiautomator + accessibility_id定位方法完全使用攻略

简介: 『App自动化测试之Appium应用篇』| uiautomator + accessibility_id定位方法完全使用攻略

1 uiautomatorviewer无法连接手机

1.1 问题现象

  • 当使用自带的uiautomatorviewer.bat连接真机时,提示以下报错:

在这里插入图片描述

  • 原因是我连接的是真机,而操作系统是Android13,但是自带的uiautomatorviewer不支持Android8.0之后的操作系统了。

1.2 解决方法

1.2.1 方法一:使用第三方文件(不建议)

  • 使用二次开发好的uiautomatorviewer,本文试过了安卓9.0可以,但是安卓13是不行的;
  • 这个可以直接搜索,比如如下这个:

在这里插入图片描述

  • 下载后有三个文件,uiautomatorviewer.jaruiautomatorviewer.jar2属于同一个文件只是页面功能略有不同,一次只可使用一个,不管下载那个最后必须重命名为uiautomatorviewer.jar
  • 进入SDK目录的D:\android-sdk-windows\tools\lib目录下,找到老的uiautomatorviewer.jar重新命名uiautomatorviewer.zip或者移动到其他地方去;
  • 将下载好的uiautomatorviewer.jar 、uiautomatorviewer.jar2复制到D:\android-sdk-windows\tools\lib目录下:

在这里插入图片描述

  • 将下载好的LvmamaXmlKit.jar上传到手机:
F:\monkey_test>adb push LvmamaXmlKit.jar /sdcard/
LvmamaXmlKit.jar: 1 file pushed, 0 skipped. 0.0 MB/s (1118 bytes in 0.027s)
  • 重新尝试可以连接了(安卓9可以,安卓13不行):

1.2.2 方法二:导入uix和png文件

  • 使用以下命令截取uix文件,保存到手机中:
adb shell uiautomator dump /sdcard/an.uix
  • 将手机中的uix文件下载到本地:
adb pull /sdcard/an.uix
  • 使用以下命令截取png文件,保存到手机中:
adb shell screencap -p /sdcard/an.png
  • 将手机中的png文件下载到本地:
adb pull /sdcard/an.png

在这里插入图片描述

  • 打开uiautomatorviewer后,导入这两个本地文件即可:

在这里插入图片描述

2 accessibility_id定位说明

  • accessibility_id定位主要使用的是元素的content-desc内容;
  • 元素的content-desc主要是针对的是Android
  • iOS上用的是labelname属性;
  • 比如安卓上的如下:

在这里插入图片描述

3 accessibility_id定位方式

  • accessibility_id定位方式方式直接使用的方法是:
AppiumBy.ACCESSIBILITY_ID
  • 源码中是这么写的:
class AppiumBy(By):
    IOS_PREDICATE = '-ios predicate string'
    IOS_UIAUTOMATION = '-ios uiautomation'
    IOS_CLASS_CHAIN = '-ios class chain'
    ANDROID_UIAUTOMATOR = '-android uiautomator'
    ANDROID_VIEWTAG = '-android viewtag'
    ANDROID_DATA_MATCHER = '-android datamatcher'
    ANDROID_VIEW_MATCHER = '-android viewmatcher'
    # Deprecated
    WINDOWS_UI_AUTOMATION = '-windows uiautomation'
    ACCESSIBILITY_ID = 'accessibility id' # 用的是这个
    IMAGE = '-image'
    CUSTOM = '-custom'
  • 示例比如:
driver.find_element(AppiumBy.ACCESSIBILITY_ID, "Browser").click()

4 bounds坐标定位说明

  • 关于坐标定位,能不用就不用,为啥呢?
  • 我们之前提供了很多的定位方式,但是有时候需要用坐标才能定位到;
  • 但是使用坐标定位很不稳定,它和手机的分辨率、屏幕尺寸等有关系;
  • 这样同一套代码可能在不同的机器上运行不下去,需要投入大量的人力进行代码修改优化,很是麻烦;
  • 坐标定位使用的是元素的bounds属性;
  • uiautomatorviewer的最后一行:

在这里插入图片描述

  • 这个坐标有两对,分别代表是按钮左上角的坐标和按钮右下角的坐标。

5 bounds坐标定位方式

  • bounds坐标定位方式为:
driver.tap()
  • 这个tap()使用如下:
    def tap(self, positions: List[Tuple[int, int]], duration: Optional[int] = None) -> 'WebDriver':
        """Taps on an particular place with up to five fingers, holding for a
        certain time

        Args:
            positions: an array of tuples representing the x/y coordinates of
                the fingers to tap. Length can be up to five.
            duration: length of time to tap, in ms

        Usage:
            driver.tap([(100, 20), (100, 60), (100, 100)], 500)

        Returns:
            Union['WebDriver', 'ActionHelpers']: Self instance
        """
  • 所以示例为:
driver.tap([(605,1022), (739,1178)], duration=50)

6 uiautomator定位简介

  • uiautomatorAndroid原生的定位方式;
  • 相对于以前提及的定位方式它的优势是功能比较强大,速度快;
  • 定位样式和xpath差不多,支持元素的全部属性定位;
  • 定位方法为:
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, "xxx")
  • 而传入的参数为一个java对象,对象是UiSelector对象。

7 UiSelector对象API

  • UiSelector对象可以参考:[UiSelector];
  • 关于UiSelector对象API有以下内容:
API 说明
checked(boolean val) 设置搜索条件以匹配当前选中的小部件(通常用于复选框)
childSelector(UiSelector selector) 将子UiSelector条件添加到此选择器。
className(String className) 设置搜索条件以匹配小部件的类属性(例如,“android.widget.Button”
className(Class<T> type) 设置搜索条件以匹配小部件的类属性(例如,“android.widget.Button”)
classNameMatches(String regex) 设置搜索条件以匹配小部件的类属性(例如,“android.widget.Button”)
clickable(boolean val) 设置搜索条件以匹配可单击的小部件
description(String desc) 设置搜索条件以匹配小部件的内容描述属性
descriptionContains(String desc) 设置搜索条件以匹配小部件的内容描述属性
descriptionMatches(String regex) 设置搜索条件以匹配小部件的内容描述属性
descriptionStartsWith(String desc) 设置搜索条件以匹配小部件的内容描述属性
enabled(boolean val) 设置搜索条件以匹配已启用的小部件
focusable(boolean val) 设置搜索条件以匹配可聚焦的小部件
focused(boolean val) 设置搜索条件以匹配具有焦点的小部件
fromParent(UiSelector selector) 将子UiSelector条件添加到此选择器,用于从父小部件开始搜索
index(int index) 设置搜索条件,以通过布局层次结构中的节点索引匹配小部件
instance(int instance) 设置搜索条件以按小部件的实例号匹配小部件
longClickable(boolean val) 设置搜索条件以匹配可长时间单击的小部件
packageName(String name) 设置搜索条件以匹配包含小部件的应用程序的包名称
packageNameMatches(String regex) 设置搜索条件以匹配包含小部件的应用程序的包名称
scrollable(boolean val) 设置搜索条件以匹配可滚动的小部件
selected(boolean val) 设置搜索条件以匹配当前选择的小部件
text(String text) 设置搜索条件以匹配小部件显示的可见文本(例如,启动应用程序的文本标签)
textContains(String text) 设置搜索条件以匹配小部件显示的可见文本(例如,启动应用程序的文本标签)
textMatches(String regex) 设置搜索条件以匹配小部件显示的可见文本(例如,启动应用程序的文本标签)
textStartsWith(String text) Text属性通常是小部件在显示器上的可见文本

8 uiautomator定位示例

8.1 text方法

  • text有四种,详见上边提到的API
  • 比如我们对某个元素属性文本是新增,我们使用text定位:
add_text = 'new UiSelector().text("新增")'
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, add_text).click()

add_text01 = 'new UiSelector().textContains("新")'
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, add_text01).click()

8.2 resourceID方法

  • 直接将resourceID整个内容,而不是属性名;
id_ele = 'resourceId("com.taobao.taobao:id/provision_positive_button")'
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, id_ele).click()

8.3 其他方法

  • 关于其他方式也是类似的,比如className、组合定位、父子定位等。
目录
相关文章
|
数据采集 监控 机器人
浅谈网页端IM技术及相关测试方法实践(包括WebSocket性能测试)
最开始转转的客服系统体系如IM、工单以及机器人等都是使用第三方的产品。但第三方产品对于转转的业务,以及客服的效率等都产生了诸多限制,所以我们决定自研替换第三方系统。下面主要分享一下网页端IM技术及相关测试方法,我们先从了解IM系统和WebSocket开始。
439 4
|
7月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
539 1
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
如何让AI更“聪明”?VLM模型的优化策略与测试方法全解析​
本文系统解析视觉语言模型(VLM)的核心机制、推理优化、评测方法与挑战。涵盖多模态对齐、KV Cache优化、性能测试及主流基准,助你全面掌握VLM技术前沿。建议点赞收藏,深入学习。
2403 8
|
7月前
|
人工智能 数据可视化 测试技术
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
933 11
|
编解码 缓存 Prometheus
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
本期内容为「ximagine」频道《显示器测试流程》的规范及标准,我们主要使用Calman、DisplayCAL、i1Profiler等软件及CA410、Spyder X、i1Pro 2等设备,是我们目前制作内容数据的重要来源,我们深知所做的仍是比较表面的活儿,和工程师、科研人员相比有着不小的差距,测试并不复杂,但是相当繁琐,收集整理测试无不花费大量时间精力,内容不完善或者有错误的地方,希望大佬指出我们好改进!
1084 16
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
|
10月前
|
测试技术
软考软件评测师——可靠性测试测试方法
软件可靠性是指软件在规定条件和时间内完成预定功能的能力,受运行环境、软件规模、内部结构、开发方法及可靠性投入等因素影响。失效概率指软件运行中出现失效的可能性,可靠度为不发生失效的概率,平均无失效时间(MTTF)体现软件可靠程度。案例分析显示,嵌入式软件需满足高可靠性要求,如机载软件的可靠度需达99.99%以上,通过定量指标评估其是否达标。
|
10月前
|
消息中间件 缓存 监控
性能测试怎么做?方法、流程与核心要点解析
本文系统阐述了性能测试的核心方法论、实施流程、问题定位优化及报告编写规范。涵盖五大测试类型(负载验证、极限压力、基准比对、持续稳定性、弹性扩展)与七项关键指标,详解各阶段任务如需求分析、场景设计和环境搭建,并提供常见瓶颈识别与优化实战案例。最后规范测试报告内容框架与数据可视化建议,为企业级实践提出建立基线库、自动化回归和全链路压测体系等建议,助力高效开展性能测试工作。
|
人工智能 自然语言处理 测试技术
AxBench:斯坦福大学推出评估语言模型控制方法的基准测试框架
AxBench 是由斯坦福大学推出,用于评估语言模型可解释性方法的基准测试框架,支持概念检测和模型转向任务,帮助研究者系统地比较不同控制技术的有效性。
396 5
AxBench:斯坦福大学推出评估语言模型控制方法的基准测试框架
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
1253 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
下一篇
开通oss服务