目录
一、前言
1、Appium元素定位
1.1、Android页面介绍
2、App常用元素定位
1.1、id定位
1.2、UIAutomator定位
1.3、Xpath定位
1.4、content-desc定位
1.5、className定位
1.6、扩展
3、App元素定位方法调用
一、前言
App自动化测试时定位元素的方式与Web自动化相似,也是通过id、class等去定位,但也有很多不同的地方。
1、Appium元素定位
Appium 和 Selenium 定位方式的区别:
|
定位方式 |
Appium |
Selenium |
说明 |
|
id |
resource-id |
id |
唯一性较强的定位方式;HTML中具有唯一性,但在App中不一定是唯一的 |
|
class name |
class |
class |
HTML 中的 class 为 css 样式类,而 App 中表示控件类型 |
|
name |
无 |
name |
Appium 1.5 以前 name 定位使用 text 属性,1.8 以后取消 |
|
Accessibility id |
content-desc |
无 |
盲人模式,输入时语音提示(Android中独有的定位方式) |
|
xpath |
使用class表示层级 |
使用标签名表示层级 |
Appium定位表达式://android.widget.TextView[@resource-id="com.moji.mjweather:id/cm3"] |
|
css selector |
无 |
css 选择器语法 |
|
|
UIAutomator |
使用 Android 官方测试框架 UIAutomator 定位 |
无 |
Android 独有定位方式 |
其余 selenium 中的定位方式,如:tag_name 、link_text 等,在 Appium 中不存在。
1.1、Android页面介绍
1.1.1、App元素定位class说明
Appium 中的 class name 定位方式针对的是 class 属性。而在 Android 中的 class 指的是该控件的类型,就像 HTML 中的标签类型。
所以 Appium 中的 class name 定位其实就等价于 Selenium 中的 tag name(标签名)定位。除了在某些特定情况下适用而外,其他绝大多数时候都很难定位到唯一的元素。
1.1.2、Android页面控件
|
Android页面控件类型 |
||
|
控件名称 |
中文释义 |
功能 |
|
ImageView |
图片控件 |
用来显示图片 |
|
TextView |
文本输入框 |
展示文字/文本 |
|
Button |
按钮 |
用户通过点击button触发一系列的事件 |
|
EditText |
编辑框 |
接受用户输入的数据 |
|
CheckBox |
复选框 |
复选/多选 |
|
ProgressBar |
进度条 |
加载进度条,表示正在加载某一些数据 |
|
Switch |
开关控件 |
左滑、右滑表示开启关闭 |
|
RatingBar |
评分条 |
星星样式的评分条 |
|
SeekBar |
拖动条 |
例如调节手机屏幕亮度的拖动条 |
|
Toast |
弹出组件 |
Toast提示语 |
|
WebView |
内嵌网页 |
App中内嵌web网页,也就是H5页面 |
1.1.3、Android页面布局
|
Android页面布局类型 |
||
|
控件名称 |
中文释义 |
功能 |
|
FrameLayout |
框架布局 |
所有控件都被放置在最左上的区域; 下一个子控件会重叠覆盖上一个控件。 |
|
LinearLayout |
线性布局 |
控件的排序方式:垂直/水平 |
|
AbsoluteLayout |
绝对布局 |
采用坐标轴的方式定位控件; 左上角原点(0,0),往右X轴递增,往下Y轴递增。 |
|
RelativeLayout |
相对布局 |
根据参照物(某控件)的位置,来确定控件的位置 |
|
TableLayout |
表格布局 |
通过表格方式(行,列)布局控件位置 |
1.1.4、Android坐标系统
Android坐标系以手机屏幕左上角的顶点为坐标原点,从该点向右为x轴正方向,从该点向下为y轴正方向。
在触控事件中,使用getRawX()和getRawY()方法获取的坐标,就是以这个坐标系为标准下的坐标值。

2、App常用元素定位
1.1、id定位
Id是一个控件的唯一标识,如果一个元素有对应的resource-id,我们就可以采用这种方式来实现元素定位操作;但是实际开发中,也有可能app项目的开发人员不是很严谨,一个页面有很多个相同的id,就需要其他方式定位。
实例:(取resource-id的值)
driver.find_element_by_id("com.wuba.zhuanzhuan:id/azo")
也可以直接用id后面的内容:
driver.find_element_by_id("azo")
1.2、UIAutomator定位
Uiautomator元素定位是Android系统原生支持的定位方式,虽然与xpath相似,但是比xpath更快,且支持元素的全部属性定位。定位原理是通过Android自带的Android Uiautomator的类库去查找元素。Appium元素定位方法其实也是基于Uiautomator来进行封装的。
1.2.1、常用的定位方式有:
id:对应Android属性的resource_id
driver.find_element_by_android_uiautomator('new UiSelector().resourceId(\"com.tencent.mm:id/e4c\")')
text:对应Android的text
driver.find_elements_by_android_uiautomator('new UiSelector().text(\"+关注\")')
classname:对应Android属性的class
driver.find_element_by_android_uiautomator('new UiSelector().className(\"android.widget.Button\")')
1.2.2、Uiautomator定位格式:
只通过id、或text、或classname其中一种方式定位
'new UiSelector().resourceId(\”****\”)’
通过多种条件同时满足的方式定位
'new UiSelector().resourceId(\”****\”). className(\”****\”)’
这种方式为链式调用,表示同时满足resourceId和className
###注意:java中字符串必须用双引号” ”
1.3、Xpath定位
xpath其实就是一个path(路径),一个描述页面元素位置信息的路径,相当于元素的坐标。xpath基于XML文档树状结构,是XML路径语言,用来查询xml文档中的节点,既可以用于XML,也可以用于HTML。
使用方式与web自动化测试的Xpath定位差不多,但是text文本使用不一样:在App自动化当中text是用@text表示,web自动化用的是text()。
实例:
# 没有contains时,属性和值之间用 =
driver.find_element_by_xpath('//android.widget.Button[@resource-id=\"com.tencent.mm:id/e4c\"]')
driver.find_element_by_xpath('//*[@text="请输入用户名"]')
# 有contains时,属性和值之间用,中间可以用and
driver.find_element_by_xpath('//*[contains(@text,"登录") and contains(@index,"5")]')
Appium 对于 xpath 定位执行效率是比较低的,一般情况下尽量不用这个定位方式。
注意:HTML中使用text文本定位时,与app的定位表达式不同,HTML中的表达式为://a[text()='新闻'],App中text前面要加@符号。
1.4、content-desc定位
某个元素属性: content-desc = “option_selected_icon”
上面的content-desc元素,可以有多种方式进行定位:
方式一:使用 find_element_by_accessibility_id 定位
driver.find_element_by_accessibility_id('option_selected_icon')
方式二:使用 find_element_by_android_uiautomator 定位
driver.find_element_by_android_uiautomator('new UiSelector().description("option_selected_icon")')
方式三:使用 xpath 定位
driver.find_element(By.XPATH, '//*[@content-desc="option_selected_icon"]')
1.5、className定位
class属性一般不唯一,多半用在复数定位,className复数定位。
某个元素属性:class = "android.widget.Button"
定位表达式:
driver.find_element_by_class_name("android.widget.Button")
1.6、扩展
通过text定位
1、通过text文本定位语法
new UiSelector().text("text文本")
2、文本比较长的时候,可以用textContains模糊匹配,只要文本包含匹配内容就可以了。
new UiSelector().textContains("包含text文本")
3、textStartsWith是以某个文本开头的匹配
new UiSelector().textStartsWith("以text文本开头")
4、正则匹配textMatches,这个需要配合正则表达式,就不举例了。
new UiSelector().textMatches("正则表达式")
索引instance()定位
在通过UiSelector定位元素时,如果匹配到多个元素,可以通过索引选择需要的那个
'new UiSelector().className(\"android.widget.Button\").instance(2)'
注意:这里的索引值不是页面元素索引index,是UiSelector()方法查找的所有元素索引。
组合定位,一般组合用id、class、text这三个属性会比较好一点
例:id+class 属性组合
id_class = 'resourceId("com.xyh.commerce:id/ll_personal").className("android.widget.LinearLayout")'
driver.find_element_by_android_uiautomator(id_class).click()
父子定位childSelector
有时候不能直接定位某个元素,但是它的父元素很好定位,这时候就先定位父元素,通过父元素找儿子。
element = 'resourceId("com.xyh.commerce:id/ll_personal").childSelector(text("我的"))'
driver.find_element_by_android_uiautomator(element)
兄弟定位fromParent
有时候父元素不好定位,但是跟他相邻的兄弟元素很好定位,这时候就可以通过兄弟元素,找到同一父级元素下的子元素。
brother = 'resourceId("com.xyh.commerce:id/img_personal").fromParent(text("我的"))'
driver.find_element_by_android_uiautomator(brother)
3、App元素定位方法调用
Python中App自动化元素定位方法的调用,与Web自动化调用的方法一致。