Appium《元素定位和UiAutomator表达式》

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Appium《元素定位和UiAutomator表达式》相关的知识,希望对你有一定的参考价值。

参考技术A

一、常见属性的用法

二、通过截图就可以看到元素的属性,那怎么元素定位呢?

三、问题

xpath 相对定位:如果相对定位中这个元素是有 id 的,这个 id 是唯一的,xpath 定位中优先通过 id 来定位。

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

「resource-id 是唯一的,但是在 App 页面中并不绝对唯一。大部分情况下是唯一的,小部分情况下是重复的。」

如果一个页面中,元素的样式非常像,那很有可能它们的 id 就是一样的。UIAutomator Viewer 这个自带的工具是不能看出这个 id 是不是绝对唯一的。

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

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

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

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

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

如果用了“升级 uiaumatorview-添加元素定位”,可以根据它的表达式自己来判断。

任何一个元素一定会有个 class,因为它是一个类别。Linearlayout 是一样的,布局也是安卓的控件,所以也会有控件名称、控件类型。

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

以上这些属性在很多情况下是没有用的,但是在关键的时刻是很有用的。

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

和 Web 自动化一样的,都是通过元素属性来定位,而且比 Web 自动化简单。

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

1、通过 id 定位元素:resrouce-id
2、通过 ClassName 定位:classname
3、通过 AccessibilityId 定位:content-desc
4、通过 AndroidUiAutomator 定位
5、通过 xpath 定位

1、通过 id 定位元素:resrouce-id
2、通过 ClassName 定位:classname
3、通过 xpath 定位

有 find_element_by_id() 就有 find_elements_by_id()

可以找到多个,它的返回值一样是列表。它的返回对象一样是 Web element 。

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

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

这里有点区别,但是方法名还是没有区别的。这个 class 的属性其实没有多大用处,一个页面中肯定很多属性的值和它很像的。所以这种用法不多。

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

「Web 自动化中 xpath 定位是最常用的,但是 App 自动化中 xpath 是最不想用的。原因是它的效率太低了。」

「如果全部只用 xpath 定位,问题会比较大,能不用 xpath 就不用 xpath」

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

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

如果通过这种方式定位,对应的方式就是:

此处应输入 content-desc 的值,但是这里是空的,所以不能通过它定位。

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

用的是安卓 UiAutomator 这个自动化框架中提供的元素定位方式。所以想用这种元素定位方式,就必须了解它到底是怎么做的。

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

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

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

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

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

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

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

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

通过 UiObject 对元素进行输入、点击等操作。

UiAutomator 是它自己的框架,所以对应的做了一套东西。UiSelector 这个类是用来表达元素定位的。UiAutomator 这里的参数就是 UiSelector 类定位表达式。

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

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

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

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

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

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

「多种条件组合起来对元素进行定位。有些元素的 id 不是唯一的,但是文本是唯一的。可以纯粹通过文本,也可以 id 和文本一起定位。」

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

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

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

一个是 resourceId()。两者都要满足才能符合我的定位表达。

匹配到正则表达式的元素也可以。

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

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

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

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

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

控件类型也属于控件的属性。大家都叫做控件,但是你叫这个名字,我叫那个名字。

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

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

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

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

实际上只通过 text 定位就可以了。除了它叫做”我的“,这个页面也没有别人叫做”我的“了。

「如果通过 id 定位、ClassName 定位、AccessibilityId 定位这前 3 种方式都没有让你唯一定位到元素,那就用第 4 种呀!」

第 4 种其实效率很高的,因为是人家框架自己的定位方式呀,都不需要转换。第 5 种 xpath 定位,写法其实和 Web 自动化的 xpath 定位的写法一样。xpath 能干的事,第 4 种方式就能全部搞定了。

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

一般的 app 都有 id,如果你测得 app 没有 id,那就去给开发提意见,把 id 加上。

app 自动化相对来说比较简单。如果把“uiaumatorview 升级版”装上了,所有的定位表达式就直接拷贝就好了。

「不需要调试也不需要考虑上下级关系,如果是比较规范的 app,通过 id 来定位就可以了。」

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

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

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

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

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

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

以上是关于Appium《元素定位和UiAutomator表达式》的主要内容,如果未能解决你的问题,请参考以下文章

app自动化测试----基础入门appium初使用2(Uiautomator 元素定位)

python-appium提示无法定位元素,添加uiautomator2后运行报错

Appium python自动化测试系列之Android UIAutomator终极定位

appium-2-uiautomator定位

UIAutomator定位简介

Appium获取Toast消息