目录
一、前言
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自动化调用的方法一致。标签:定位,控件,text,app,元素,class,测试,自动化,id From: https://www.cnblogs.com/FBGG/p/16790090.html
引用文章:https://www.cnblogs.com/zdx20/p/15049979.html