app自动化测试元素定位

目录

一、前言

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自动化调用的方法一致。

引用文章:https://www.cnblogs.com/zdx20/p/15049979.html
posted @ 2022-10-13 23:12  博无止境  阅读(553)  评论(0编辑  收藏  举报