『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、组合定位、父子定位等。
目录
相关文章
|
29天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
84 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
27天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
3月前
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
|
3月前
|
测试技术
基于LangChain手工测试用例转App自动化测试生成工具
在传统App自动化测试中,测试工程师需手动将功能测试用例转化为自动化用例。市面上多数产品通过录制操作生成测试用例,但可维护性差。本文探讨了利用大模型直接生成自动化测试用例的可能性,介绍了如何使用LangChain将功能测试用例转换为App自动化测试用例,大幅节省人力与资源。通过封装App底层工具并与大模型结合,记录执行步骤并生成自动化测试代码,最终实现高效自动化的测试流程。
|
4月前
【Azure Logic App】在逻辑应用中开启或关闭一个工作流是否会对其它工作流产生影响呢?
【Azure Logic App】在逻辑应用中开启或关闭一个工作流是否会对其它工作流产生影响呢?
|
4月前
|
存储 SQL JSON
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
|
4月前
|
测试技术
一款功能完善的智能匹配1V1视频聊天App应该通过的测试CASE
文章列举了一系列针对1V1视频聊天App的测试用例,包括UI样式、权限请求、登录流程、匹配逻辑、消息处理、充值功能等多个方面的测试点,并标注了每个测试用例的执行状态,如通过(PASS)、失败(FAIL)或需要进一步处理(延期修改、待定、方案再定等)。
69 0
|
4月前
|
安全 前端开发 网络安全
【Azure App Service】访问App Service应用报错 SSL: WRONG_VERSION_NUMBER
【Azure App Service】访问App Service应用报错 SSL: WRONG_VERSION_NUMBER
143 0
|
4月前
|
存储 Linux 网络安全
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)
|
2月前
|
Java 测试技术 C#
自动化测试之美:从Selenium到Appium
【10月更文挑战第3天】在软件开发的海洋中,自动化测试如同一艘航船,引领着质量保证的方向。本文将带你领略自动化测试的魅力,从Web端的Selenium到移动端的Appium,我们将一探究竟,看看这些工具如何帮助我们高效地进行软件测试。你将了解到,自动化测试不仅仅是技术的展示,更是一种提升开发效率和产品质量的智慧选择。让我们一起启航,探索自动化测试的世界!