Appium自动化(10) - appium高级元素定位方式之 UI Automator API 的详解
如果你还想从头学起Appium,可以看看这个系列的文章哦!
https://www.cnblogs.com/poloyy/category/1693896.html
前言
前面介绍过根据id,classname, accessibilityid,xpath来定位元素,其他这些方法底层都是利用了 UI Automator 的 API 功能实现的
UI Automator 介绍
- UI Automator 测试框架提供了一组 API 来构建 UI 测试,用于在用户应用和系统应用中执行交互
- 利用 UI Automator API,可以打开“设置”菜单或应用启动器等操作
- UI Automator 测试框架非常适合编写黑盒自动化测试,其中的测试代码不依赖于目标应用的内部
UI Automator 提供的功能
- 自带的元素定位工具
- 在设备上检索状态信息并执行操作的API
- 支持跨应用 UI 测试的API
UI Automator 访问设备状态
UI Automator 测试框架提供了一个 UiDevice 类,用于在 app 运行的设备上进行访问和执行等操作,它提供了以下操作
- 更改设备旋转
- 按D-pad按钮
- 按返回、主屏幕、菜单按钮
- 打开通知栏
- 对当前窗口进行屏幕截图
更多的 UI Automator API
利用 UI Automator API,可以编写稳健可靠的测试,而无需了解目标应用的实现详情
下面将列出常见的类,它们都是在 android.support.test.uiautomator 这个库下的
| 类 | 类名 | 作用 |
| UiDevice | 设备封装类 | 上面说到的,获取设备信息和设备交互 |
| UiObject | 所有空间抽象类 | 表示设备上可见的一个Android控件 |
| UiSelector | 控制选择器 | 在设备上查询一个或多个目标 UI 元素 |
| Configurator | 配置基类 | 设置运行 UI Automator 测试所需的关键参数 |
| UiScrollable | 滚动控件 | 当目标控件存在于屏幕之外时使用 |
| UiCollection | 控件集合 | 控件遍历,枚举容器的 UI 元素以便计算子元素个数 |
划重点
- 其中 UiSelector 在 appium 自动化代码选择元素时候直接使用到的
- 用来生成一个定位器来选择界面中的控件元素,可以通过text,content-desc,class,和一些状态信息来进行条件过滤
- UiSelector 类似于 appium中 find_element_by_xxx() 方法中函数值
- UiSelector官方文档:https://developer.android.google.cn/reference/android/support/test/uiautomator/UiSelector
难点
- 使用 UI Automator API,需要写Java 代码哦!
- 当然如果没有基础的话,记住对应的语法格式就行
UiSelector 的栗子
Java语法
new UiSelector().resourceId(“io.manong.developerdaily:id/tv_tab_title”)
结合Appium 的用法
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.hpbr.bosszhipin:id/tv_tab_label")')
还是结合boss直聘 app 做例子哦
环境要求:Android

代码
# 此处省略配置代码...
# 通过resourceId
test = driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.hpbr.bosszhipin:id/tv_tab_label")')
print(test.text) # 通过text
test = driver.find_element_by_android_uiautomator('new UiSelector().text("附近")')
print(test.text) # 通过className
test = driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.TextView")')
print(test.text)
输出结果
推荐
附近
自动化测试
UiSelector 还可以通过哪些方法来定位元素

基本上除了xpath之外,可以通过appium实现的元素定位方式,UIAutomator也有,因为底层就是靠他实现的
xpath 虽然没有直接对应的方法,但是像下面这种 xpath 写法,UIAutomator 也有对应的方法
- // :表示任意后代关系
- x[n] : 表示第几个子节点

小栗子
# 正常appium写法
test = driver.find_elements_by_id("com.hpbr.bosszhipin:id/tv_tab_label")[1]
# 结合uiautomator写法
test = driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.hpbr.bosszhipin:id/tv_tab_label").enabled(true).instance(1)')
emmm...两种写法得到的结果是一样的,但第二种写法有点复杂就是了...太长了
UI Automator 的总结
- 当 Appium 封装的方法无法满足你的需求的时候可以尝试用 UI Automator API 去解决问题
- 但不建议,在日常工作中全都用 UI Automator API,学习成本 & 编写成本 & 维护成本都会高很多(当然,你想装逼也不是不可以)
Appium自动化(10) - appium高级元素定位方式之 UI Automator API 的详解的更多相关文章
- 【python+selenium的web自动化】- 8种元素定位方式详解
我们在做WEB自动化时,最根本的就是操作页面上的各种元素,而操作的基础便是元素的定位,只有准确地定位到唯一元素才能进行后续的自动化控制,下面将对各种元素定位方式进行总结归纳. 说明:以下操作统 ...
- Appium常用的3种元素定位方式
以最右App为例 .apk文件网盘地址: 链接:https://pan.baidu.com/s/1L4MYkhpb5ECe8XeaneTx_Q 提取码:0jqm 1.find_element_by_i ...
- 6.1 python+appium元素定位方式(登录app)
1.0.0 :常见的十种元素定位方式 .driver.find_element_by_id() #id定位 .driver.find_element_by_name() #name定位(已经凉 ...
- App自动化《元素定位方式、元素操作、混合应用、分层设计、代码方式执行Pytest 命令》
坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.App 元素定位方式 二.元素操作 三.测试混合应用 四.以代码的方式执行 Pytest 命 ...
- Appium常用操作之「元素定位、swipe 滑屏操作」
坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.打开 uiautomatorviewer 二.Appium 常用操作 1.用 layui 做 ...
- APPIUM-Android自动化元素定位方式
一.常用元素定位方法 appium从selenium中继承了所有的元素定位方法, 并且增加了一些自己的元素定位方式,下方截图分别为selenium和MobileBy包源码: 但是从继承selenium ...
- App自动化之dom结构和元素定位方式(包含滑动列表定位)
900×383 38 KB 先来看几个名词和解释: dom: Document Object Model 文档对象模型 dom应用: 最早应用于html和js的交互.界面的结构化描述, 常见的格式为h ...
- 技术分享 | app自动化测试(Android)--元素定位方式与隐式等待
原文链接 元素定位是 UI 自动化测试中最关键的一步,假如没有定位到元素,也就无法完成对页面的操作.那么在页面中如何定位到想要的元素,本小节讨论 Appium 元素定位方式. Appium的元素定位方 ...
- selenium8中元素定位方式
Selenium对网页的控制是基于各种前端元素的,在使用过程中,对于元素的定位是基础,只有准去抓取到对应元素才能进行后续的自动化控制,我在这里将对各种元素定位方式进行总结归纳一下. 这里将统一使用百度 ...
随机推荐
- vue.js click点击事件获取当前元素对象
Vue.js可以传递$event对象 <body id="app"> <ul> <li v-on:click="say('hello!', ...
- web--ajax--json
案例: 其中,用eval()解析的话,如果json有一些代码,如:{"age":"alert(你好)"},他也会帮你实行,而JOSN.parse();则会自动报 ...
- Cent OS 7 添加 EPEL Nux Dextop ELRepo等源
Cent OS 7 添加第三方yum源 CentOS由于很追求稳定性,所以官方源中自带的软件不多,因而需要一些第三方源. 比如EPEL.ATrpms.ELRepo.Nux Dextop.RepoFor ...
- 2019-2020-1 20199325《Linux内核原理与分析》第二周作业
冯诺依曼计算机硬件框图: 下面是一个简单的程序example.c. intadd_a_and_b(int a,int b){returna+b;}intmain(){returnadd_a_and_b ...
- 【Django】runserver 0.0.0.0:0 后,究竟发生了什么
WSGI协议 Django是遵循WSGI协议设计的 WSGI协议主要包括server和application两个部分: WSGI server:负责从客户端接收请求,将request转发给applic ...
- JAVA 之 EL表达式
一.什么是EL表达式 1.Expression Language表达式语言 2.是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据) 语法格式:${expression } 二.EL中的 ...
- 阿里巴巴年薪800k大数据全栈工程师成长记
大数据全栈工程师一词,最早出现于Facebook工程师Calos Bueno的一篇文章 - Full Stack (需fanqiang).他把全栈工程师定义为对性能影响有着深入理解的技术通才.自那以后 ...
- 从零开始搭建口袋妖怪管理系统(4)-借助webpack4.6工程化项目(上)
"手动是不可能手动的了,这辈子都不可能手动的了." 一.目标 上一章我们借助ngRoute,完成了口袋妖怪SPA系统的多模块导航开发,但是现在引用的东西越来越多,项目文件目录开始变 ...
- CodeForces - 1245 C - Constanze's Machine
Codeforces Round #597 (Div. 2) Constanze is the smartest girl in her village but she has bad eyesigh ...
- DP 60题 -3 HDU1058 Humble Numbers DP求状态数的老祖宗题目
Humble Numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...