『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、组合定位、父子定位等。
目录
相关文章
|
监控 C#
【Function App】如果一个拥有多个Function App的Plan遇见了High CPU问题? 如何方便定位是哪一个Function App引发的呢?
在Azure Function App测试中,若多个Function App共用同一App Service Plan资源,当出现High CPU问题时,由于Function App公开指标无法直接观测CPU状态,可通过启用Application Insights解决。其Live Metrics功能可过滤并查看每个Function App的CPU使用情况。具体步骤为:将所有Function App连接至同一Application Insights资源,进入Live Metrics页面按Role筛选监控数据。附有三段C#代码示例,分别展示占用CPU、Memory及普通功能的实现方法。
319 36
|
11月前
|
前端开发 定位技术
《仿盒马》app开发技术分享-- 定位获取(25)
上一节我们实现了地址管理页面的数据查询和展示,接下来我们要实现的功能是地址添加相关的,我们想实现的功能是地图选点,那么在地图选点之前我们要做的就是先获取用户当前的定位。获取定位后我们拿到经纬度和其他信息,然后在对应的地图上展示。
212 0
|
Java 测试技术 C#
自动化测试之美:从Selenium到Appium
【10月更文挑战第3天】在软件开发的海洋中,自动化测试如同一艘航船,引领着质量保证的方向。本文将带你领略自动化测试的魅力,从Web端的Selenium到移动端的Appium,我们将一探究竟,看看这些工具如何帮助我们高效地进行软件测试。你将了解到,自动化测试不仅仅是技术的展示,更是一种提升开发效率和产品质量的智慧选择。让我们一起启航,探索自动化测试的世界!
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
1318 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
基于LangChain手工测试用例转App自动化测试生成工具
在传统App自动化测试中,测试工程师需手动将功能测试用例转化为自动化用例。市面上多数产品通过录制操作生成测试用例,但可维护性差。本文探讨了利用大模型直接生成自动化测试用例的可能性,介绍了如何使用LangChain将功能测试用例转换为App自动化测试用例,大幅节省人力与资源。通过封装App底层工具并与大模型结合,记录执行步骤并生成自动化测试代码,最终实现高效自动化的测试流程。
|
敏捷开发 Java 测试技术
探索自动化测试的奥秘:从Selenium到Appium
【9月更文挑战第14天】软件测试,这个看似枯燥乏味却至关重要的领域,正经历着一场革命。随着技术的进步,自动化测试工具如Selenium和Appium已成为质量保证的利器。本文将带你一探这些工具的神秘面纱,了解它们如何简化测试流程、提升效率,并确保软件产品的质量。准备好,我们将深入自动化测试的世界,解锁其背后的原理和实践技巧。
|
Java 测试技术 API
探索自动化测试的奥秘:从Selenium到Appium
【8月更文挑战第31天】本文旨在引导读者理解自动化测试的重要性,并逐步深入介绍如何利用Selenium和Appium这两个强大的工具来提升测试效率和质量。文章不仅分享理论知识,还通过具体代码示例,展示如何在Web应用和移动应用测试中实施自动化策略。
|
测试技术 Android开发 iOS开发
探索自动化测试的奥秘:从Selenium到Appium
【8月更文挑战第31天】在软件测试的海洋中,自动化测试如同一艘快艇,带领我们高效地穿越波涛汹涌的手动测试海域。本文将带你从Selenium的网页自动化测试出发,一路驶向Appium的移动应用自动化测试岛屿,揭秘这两种工具如何改变软件测试的航向。你将看到代码示例的灯塔,指引你理解它们如何在实战中发挥作用,以及为什么掌握这些技能对于测试人员来说至关重要。
|
Java 测试技术 Android开发
探索自动化测试之美:从Selenium到Appium
【8月更文挑战第31天】在软件开发的世界中,测试是确保产品质量的关键步骤。随着技术的发展,自动化测试工具如Selenium和Appium成为了开发者的得力助手。本文将通过一个简单的代码示例,带领读者了解如何利用这些工具进行高效的自动化测试,确保软件的稳定性和可靠性,同时也让测试过程变得更加轻松有趣。
|
JavaScript Java 测试技术
《手把手教你》系列技巧篇(四十六)-java+ selenium自动化测试-web页面定位toast-下篇(详解教程)
【5月更文挑战第10天】本文介绍了使用Java和Selenium进行Web自动化测试的实践,以安居客网站为例。最后,提到了在浏览器开发者工具中调试和观察页面元素的方法。
255 2