Appium之「元素定位和UiAutomator表达式」

坚持原创输出,点击蓝字关注我吧

做者:清菡
博客:oschina、云+社区、知乎等各大平台都有。
html

目录

  • 1、常见属性的用法
    • 1.怎么用 resource-id?
    • 2.其它属性
  • 2、经过截图就能够看到元素的属性,那怎么元素定位呢?
    • 1.appium - app 页面元素定位
    • 2.UiAutomator 的表达式
    • 3.何时用 UiAutomator 呢?
    • 4.和 Web 自动化的定位有啥区别?
  • 3、问题
    • 1.元素与属性的区别?
    • 2.app 一进模拟器就崩溃
    • 3.若是遇到点击 uiautomatorviewer 就闪退

1、常见属性的用法

xpath 相对定位:若是相对定位中这个元素是有 id 的,这个 id 是惟一的,xpath 定位中优先经过 id 来定位。python

class 属性对应的值是元素类型(是一个文本视图工具),Web 自动化中元素类型表明 Input、image、button 这样的标签名。android

1.怎么用 resource-id?

「resource-id 是惟一的,可是在 App 页面中并不绝对惟一。大部分状况下是惟一的,小部分状况下是重复的。」web

若是一个页面中,元素的样式很是像,那颇有可能它们的 id 就是同样的。UIAutomator Viewer 这个自带的工具是不能看出这个 id 是否是绝对惟一的。正则表达式

「假设 resource-id 是惟一的,用相对定位这样定位:」后端

和 Web 自动化同样的玩法:元素类型[@属性名称=属性值]微信

这里的 class 不是 Web 网页中的 class 属性了,这里表明它的标签名和元素类型(它是一个图片、一个文字、连接仍是一个按钮呢?学会区分)。网络

若是 resource-id 不是惟一的,那么上面那个表达式是不够的,还会追加到上层的 LinearlayoutRelativeLayout、包括祖先里面的一些层级都会放进来。app

若是没有安装“升级 uiaumatorview-添加元素定位”就只能靠本身来判断。看下其它和它长得很像、元素的格式、风格、样式、页面布局都和它如出一辙的元素,看下各位的 id 是否全都是同样的。框架

若是用了“升级 uiaumatorview-添加元素定位”,能够根据它的表达式本身来判断。

任何一个元素必定会有个 class,由于它是一个类别。Linearlayout 是同样的,布局也是安卓的控件,因此也会有控件名称、控件类型。

如下这些东西只有 2 个值,False 和 True。

2.其它属性

以上这些属性在不少状况下是没有用的,可是在关键的时刻是颇有用的。

例如想筛选当前页面中能够滚动的元素,经过 scrollable 等于 True 来过滤。

2、经过截图就能够看到元素的属性,那怎么元素定位呢?

和 Web 自动化同样的,都是经过元素属性来定位,并且比 Web 自动化简单。

App 中只支持 5 种元素定位方式。虽然继承了 Web 自动化的元素定位,它之因此继承呢,是用到了其中的一个部分。

1.appium - app 页面元素定位

一、经过 id 定位元素:resrouce-id
二、经过 ClassName 定位:classname
三、经过 AccessibilityId 定位:content-desc
四、经过 AndroidUiAutomator 定位
五、经过 xpath 定位

与 Web 自动化通用的是 3 种:

一、经过 id 定位元素:resrouce-id
二、经过 ClassName 定位:classname
三、经过 xpath 定位

1.1经过 id 定位元素:resrouce-id
#id
driver.find_element_by_id("保密")

find_element_by_id()就有find_elements_by_id()

能够找到多个,它的返回值同样是列表。它的返回对象同样是 Web element

源码:

来自于这个文件:

在它的下面有个find_element_by_id()。它的方法和 Web 自动化是同样的。

1.2第二种定位方式 ClassName,ClassName 就是这里的 class 属性。

虽然这里表明的是元素类型,但它一样是 class 属性。

因此用这种方法就是这样写:
#class
driver.find_element_by_class_name("保密")

这里有点区别,可是方法名仍是没有区别的。这个 class 的属性其实没有多大用处,一个页面中确定不少属性的值和它很像的。因此这种用法很少。

既然是类别,图片可能有好多种,输入框也有好多种,它表明的是一种元素的类型。

「Web 自动化中 xpath 定位是最经常使用的,可是 App 自动化中 xpath 是最不想用的。缘由是它的效率过低了。」

「若是所有只用 xpath 定位,问题会比较大,能不用 xpath 就不用 xpath」

1.3经过 AccessibilityId 定位

AccessibilityId 是移动端特有的定位方式。

from appium.webdriver.common.mobileby import MobileBy

这是以前看到的类,这个类当中除了继承了 Web 自动化以外,对于安卓有 2 种,其中一种是ACCESSIBILITY_ID

源码以下:

若是经过这种方式定位,对应的方式就是:

#content-desc
driver.find_element_by_accessibility_id()

此处应输入 content-desc 的值,可是这里是空的,因此不能经过它定位。

可是find_element_by_accessibility_id()是另一种 id,表明它在当前这个页面中也是很独特的。只要它有值,基本上能够经过它来定位。

1.4经过 AndroidUiAutomator 定位

用的是安卓 UiAutomator 这个自动化框架中提供的元素定位方式。因此想用这种元素定位方式,就必须了解它究竟是怎么作的。

UiAutomator 自动化库是 Java 语言写的,因此它的参数是 Java 代码。UiAutomator 自动化库提供了 text。而「元素有文本内容就能够经过文本内容来定位。」

这个里面的参数就必须是 UiAutomator 当中提供的定位方式。UiAutomator 是 Java 实现的,那么它的定位类型确定也是 Java 实现的。

这个是谷歌开发中心的网址,有对 UiAutomator 的介绍:

https://developer.android.com/training/testing/ui-automator.html#ui-automator-viewer

UiAutomator 去定位元素的时候用的 UiSelector 类。Api 的官方文档:

Appium 中经过 driver.find_element 来找元素的,找到的结果对象是一个 WebEmemt

「可是括号里面,不一样的定位类型你要输入不一样的定位表达式。」

UiSelector 是个 Java 类,主要用来作元素定位表达式。什么来表明 UiSelector 中的 WebEmemt 呢?

经过 UiSelector 找到元素,这是表达式。总有一个方法经过它来找吧?

那就是 UiObject。UiObject 对应到 WebEmemt。WebEmemt 有对元素的各类操做以及属性的获取。「UiObject 就是 WebEmemt,有各类对元素的操做。」

UiObject 就能够获取这么多的属性:

经过 UiObject 对元素进行输入、点击等操做。

UiAutomator 是它本身的框架,因此对应的作了一套东西。UiSelector 这个类是用来表达元素定位的。UiAutomator 这里的参数就是 UiSelector 类定位表达式。

Public constructors 公共的构造函数,构造函数就是初始化函数。类初始化的时候,有时候 init 是有参数的,构建函数当中就告诉了你它有没有参数。

初始化的表达式:

UiSelector()

Java 中这样写:

new ui= UiSelector() 这就是表明类的实例化。

python 中这样写:

ui = UiSelector()

简写的作法:

new UiSelector()

有的时候并不用一个变量去接收它。在 Web 自动化当中,直接实例名称.方法就能够了。

在 Java 中不须要用一个变量去接收实例化对象,那就直接这样写new UiSelector().后面调它的各类方法。Java 中每个变量必须声明变量类型,它是个布尔值,是个类仍是什么。

事实上只有一个变量,叫作 val。

在这个地方,类也算一种数据类型。在 Python 中,类也算一种数据类型,是你本身构造的这种数据类型,只不过不须要声明而已。

清一色的返回值基本都是类自己。

若是是一个实例化对象,那它的返回值都是实例化对象。每个实例化对象均可以有这么多方法。

.checkable(true)返回值就是new UiSelector()。接下来能够经过别的方式组合起来。

「多种条件组合起来对元素进行定位。有些元素的 id 不是惟一的,可是文本是惟一的。能够纯粹经过文本,也能够 id 和文本一块儿定位。」

resourceId 有 2 种方式:

「人家这里是“字符串”,在 Java 中单引号和双引号是有区别的。若是在 Java 中是字符串,只能用双引号,否则就是报错。」

new UiSelector().checkable(true).resourceId(“保密”)

经过 2 个属性来定位的,一个是 checkable()。

一个是 resourceId()。二者都要知足才能符合个人定位表达。

匹配到正则表达式的元素也能够。

text 提供了 4 种定位方式:

第一种:全局匹配(彻底文本匹配)。

new UiSelector().checkable(true).resourceId(“保密”).text(“个人”)

第二种:包含。

第三种:正则表达式的匹配。

textstartswith:以什么开头的一个字符串。

若是你的文本很长,能够定义以什么开头,也能够实现部分匹配。只不过这个部分匹配是有要求的,必须以什么开头。

这 4 种方式均可以用的,参数全是字符串。

除了 text 是文本性质的,content-desc 也是文本性质的。

content-desc 也提供了 4 种定位方式:

className:匹配一个控件的类型。

控件类型也属于控件的属性。你们都叫作控件,可是你叫这个名字,我叫那个名字。

每一个元素的 package 都是同样的,因此 package 没多大用处。

scrollable:除了 UiAutomator 能够提供到位,xpath 也能够作到可是有所欠缺。

UiAutomator 自动化库提供了各类属性。只要学会表达式,而后能本身判断用什么样的类型来定位就行了。

2.UiAutomator 的表达式

使用 UiAutomator 中的 UiSelector 类来处理元素定位。

new UiSelector().函数名称(“定位表达式”)

字符串是双引号,布尔值就不是双引号了。

driver.find_element_by_android_uiautomator('new UiSelector().resourceId("保密").text("个人")')#这种用法,外面只能用单引号或者里面的双引号打个斜杠标明下

实际上只经过 text 定位就能够了。除了它叫作”个人“,这个页面也没有别人叫作”个人“了。

因此改为这样:
# UiAutomator
driver.find_element_by_android_uiautomator('new UiSelector().text("个人")')#这种用法,外面
# 只能用单引号或者里面的双引号打个斜杠标明下

3.何时用 UiAutomator 呢?

「若是经过 id 定位、ClassName 定位、AccessibilityId 定位这前 3 种方式都没有让你惟必定位到元素,那就用第 4 种呀!」

第 4 种其实效率很高的,由于是人家框架本身的定位方式呀,都不须要转换。第 5 种 xpath 定位,写法其实和 Web 自动化的 xpath 定位的写法同样。xpath 能干的事,第 4 种方式就能所有搞定了。

以上 5 种都搞不定的状况下,就须要用坐标了。可是坐标不太稳定,除非实在没有办法了才用坐标,坐标比 xpath 还差劲。

通常的 app 都有 id,若是你测得 app 没有 id,那就去给开发提意见,把 id 加上。

4.和 Web 自动化的定位有啥区别?

app 自动化相对来讲比较简单。若是把“uiaumatorview 升级版”装上了,全部的定位表达式就直接拷贝就行了。

「不须要调试也不须要考虑上下级关系,若是是比较规范的 app,经过 id 来定位就能够了。」

和 Web 自动化的写法同样。4 大属性都同样(点击、输入、获取元素的文本内容、获取元素的属性)。函数名称同样,操做方式也同样。须要等待,等待方法也和 Web 自动化同样。

3、问题

1.元素与属性的区别?

元素:

一对(或一个)标签包含的范围:其实能够理解为元素为一个容器,而这容器里面包含了标签。

这里的一对标签:<body> </body>就是开始和结束标签。

范围:就是从开始标签<body>到结束标签</body> 下面那个矩形框架就是这里的范围。

图片来自网络,画的很好

2. app 一进模拟器就崩溃

Appium 的 bug 比较多,须要换个版本试下,不要装太老的或者最新的。隔 2-3 个版本换个试下。和操做系统也有关系,有时 win7 不行,win10 就能够。

3.若是遇到点击 uiautomatorviewer 就闪退

在 cmd 命令行中启动 uiautomatorviewer.exe,命令行有的时候能够看出来是什么错误致使。通常是有冲突。还有看看你的安装包装全了没有,好比 jdk、环境变量有没有配置正确之类的。


公众号「清菡软件测试」首发,更多原创文章:清菡软件测试 88+原创文章,欢迎关注、交流,禁止第三方擅自转载。




精彩推荐




更新“Appium运行原理”讲解!
Ui Automator 框架和Ui Automator Viewer你会用吗?附送「必备adb命令」拿走不谢 !
举个华为计算器的栗子「Appium环境配置与调试」
怎么安装配置ADB环境?
pytest的fixture怎么用?
Python+Appium运行简单的demo,你须要理解Appium运行原理!
Web自动化必会知识:「Web基础、元素定位、元素操做、Selenium运行原理、项目实战+框架」
使用Typora+PicGo配置Gitee图床
持续集成有什么好处?快来看鸭
按F12,你真的会准肯定位先后端问题吗?

感谢支持清菡原创,欢迎点击在看转发

本文分享自微信公众号 - 清菡软件测试(qinghanTester)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索