共计 5410 个字符,预计需要花费 14 分钟才能阅读完成。
保持原创输入,点击蓝字关注我吧
作者:清菡
博客:oschina、云 + 社区、知乎等各大平台都有。
目录
-
一、常见属性的用法
- 1. 怎么用 resource-id?
- 2. 其它属性
-
二、通过截图就能够看到元素的属性,那怎么元素定位呢?
- 1.appium – app 页面元素定位
- 2.UiAutomator 的表达式
- 3. 什么时候用 UiAutomator 呢?
- 4. 和 Web 自动化的定位有啥区别?
-
三、问题
- 1. 元素与属性的区别?
- 2.app 一进模拟器就解体
- 3. 如果遇到点击 uiautomatorviewer 就闪退
一、常见属性的用法
xpath 绝对定位:如果绝对定位中这个元素是有 id 的,这个 id 是惟一的,xpath 定位中优先通过 id 来定位。
class 属性对应的值是元素类型(是一个文本视图工具),Web 自动化中元素类型代表 Input、image、button 这样的标签名。
1. 怎么用 resource-id?
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。
2. 其它属性
以上这些属性在很多状况下是没有用的,然而在要害的时刻是很有用的。
例如想筛选以后页面中能够滚动的元素,通过 scrollable 等于 True 来过滤。
二、通过截图就能够看到元素的属性,那怎么元素定位呢?
和 Web 自动化一样的,都是通过元素属性来定位,而且比 Web 自动化简略。
App 中只反对 5 种元素定位形式。尽管继承了 Web 自动化的元素定位,它之所以继承呢,是用到了其中的一个局部。
1.appium – app 页面元素定位
1、通过 id 定位元素:resrouce-id
2、通过 ClassName 定位:classname
3、通过 AccessibilityId 定位:content-desc
4、通过 AndroidUiAutomator 定位
5、通过 xpath 定位
与 Web 自动化通用的是 3 种:
1、通过 id 定位元素:resrouce-id
2、通过 ClassName 定位:classname
3、通过 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…
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 自动化一样。
三、问题
1. 元素与属性的区别?
元素:
一对(或一个)标签蕴含的范畴:其实能够了解为元素为一个容器,而这容器外面蕴含了标签。
这里的一对标签:<body> </body>
就是开始和完结标签。
范畴:就是从开始标签 <body>
到完结标签</body>
上面那个矩形框架就是这里的范畴。
2. app 一进模拟器就解体
Appium 的 bug 比拟多,须要换个版本试下,不要装太老的或者最新的。隔 2-3 个版本换个试下。和操作系统也有关系,有时 win7 不行,win10 就能够。
3. 如果遇到点击 uiautomatorviewer 就闪退
在 cmd 命令行中启动 uiautomatorviewer.exe,命令行有的时候能够看进去是什么谬误导致。个别是有抵触。还有看看你的装置包装全了没有,比方 jdk、环境变量有没有配置正确之类的。
公众号 清菡软件测试 首发,更多原创文章:清菡软件测试 87+ 原创文章,欢送关注、交换,禁止第三方擅自转载。