0. 定位前的准备工作
在定位APP控件时,需要将APP页面dump到uiautomatorviewer中,然后通过uiautomatorviewer定位控件
能够将手机界面dump出来的前提:
1.打开appium并处于监听状态
2.电脑已开启模拟器或连接真机
3.adb已连接(cmd中输入adb devices,会显示已有设备连接)
- uiautomatorviewer打开方式
双击sdk\tools下的uiautomatorviewer.bat文件,等待出现第二个窗口
APP中的3种属性:text、resource-id、class,在APP中,id/class_name基本上都不是唯一的,xpath可以写成唯一的
1. 通过id定位
定位方式 | 说明 |
---|---|
find_element_by_id | 找到一个,如果当前界面有多个相同id的控件,则找到第一个 |
find_elements_by_id | 找到一组,平行结构的ID可能是一样的,下标从0开始 |
ele1 = driver.find_element_by_id("cn.xiaochuankeji.tieba:id/title")
print(ele1.text) #获取文本信息
ele1.click() #点击
ele2 = driver.find_elements_by_id("cn.xiaochuankeji.tieba:id/title") #找到一组,平行结构的ID可能是一样的
ele2[2].click() #通过下标区分
2. 通过class定位
- 通过class定位:在APP中,class代表控件类型,所有控件肯定都有class属性
- 与web端class属性定位有区别,在app中,class属性更像web中标签的概念
- android中大多数控件都放在android.widget下,
- TextView:文本类型 输入框:Edit.Text 图标:ImageView
- 安卓控件是根据从左到右,从上到下排布的,可根据数字来具体定位到某一控件
定位方式 | 说明 |
---|---|
find_element_by_class_name | 找到一个,如果当前界面有多个相同class的控件,则找到第一个 |
find_elements_by_class_name | 找到一组,平行结构的class可能是一样的,下标从0开始 |
#当前界面只有一个相同的class属性控件,使用element
ele3 = driver.find_element_by_class_name("android.widget.TextView")
#当前界面有很多相同的class属性控件,使用elements
# 会把当前所有相同class的控件都找出来,再通过下标定位具体控件
ele4 = driver.find_elements_by_class_name("android.widget.TextView") #ele4此时是一个列表,表中放了很多控件
#对于文本控件,可加下面的日志,查看对应下标
for i in range(0,len(ele4)):
print("第"+str(i)+"个="+ele4[i].text) #将每个控件的文本信息及其下标打印出来(i是整型,无法与字符串直接连接,故转换成字符串)
ele4[3].click() #点击想要的控件
#对于图片控件,根据dom树来确定下标,将没展开的都展开,查看ImageView,下标是从0开始
3. 通过xpath定位
-使用xpath定位格式://class属性[@resource-id=‘id属性’]
- APP一般使用xpath相对路径定位,不使用绝对路径,因为绝对路径会很长
通过xpath定位注意点 |
---|
xpath通过id查找单个元素(定位关注按钮),使用element |
xpath通过text文本定位,如果文本是动态的(比如发的朋友圈动态),尽量不要@text属性 |
xpath通过text文本定位,无控件属性时,可使用正则代替,如//[text=‘图文’] |
xpath可通过class查找单个元素,class既能当一种控件类型,也能当一种属性 |
使用多个属性定位,使用and连接,如//*[@resource-id=‘cn.xiaochuankeji.tieba:id/title’ and @text=‘视频’] |
通过层级定位:父级找子级,先定位到父级,父级后跟/,然后后面跟子级的控件类型,xpath下标从1开始 |
子级定位到父级,可使用…实现 |
使用xpath定位肯定想要路径是唯一的,所以尽量不要使用find_elements这种方法 |
#xpath通过id查找单个元素(定位关注按钮),使用element
ele5 = driver.find_element_by_xpath("//android.widget.TextView[@resource-id='cn.xiaochuankeji.tieba:id/title']")
ele5.click()
#xpath通过text文本定位
#注意:如果文本是动态的(比如发的朋友圈动态),尽量不要@text属性
ele7 = driver