常用识别APP页面的工具
uiautomatorviewer.bat :Android sdk自带的工具,在tool目录下,双击打开。
monitor.bat:也是Android sdk 自带的工具,在tool目录下,双击就能打开。
appium inspector :appium自带的工具,mac下可以使用。
。。。。。。。
web页面元素识别工具:Firebug、Firepath、Chrome inspector
参考:https://mp.weixin.qq.com/s/qIOYIZO0-iUEw1z6ONrhHg
下面是uiautomator 抓取到页面:
参考说明:http://blog.csdn.net/jojoy_tester/article/details/73195703#t2
定位方法使用
ID定位
find_element_by_id()
(取resource-id的属性值)
eg:
driver.find_element_by_id('com.thinkwu.live:id/et_phone_number')
也可以直接取id后面的字符串:
driver.find_element_by_id('et_phone_number')
classname定位
find_element_by_class_name()
(取class的属性值)
eg:
driver.find_element_by_class_name('android.widget.EditText')
注意:因为是类的属性,所以重复性是很高的,一般很少用classname定位。系统会默认选择第一个属性。
name定位
find_element_by_name()
(取text的属性值)
在web view中html是有name属性的,在native并没有name属性,这里可以用text属性值。
eg:
driver.find_element_by_name('请输入你的手机号码')
注意:在新版的appium中已经是去掉name定位了。旧的appium还是可以用的。
xpath定位
find_element_by_xpath()
eg:
driver.find_element_by_xpath('//android.widget.EditText[@resource-id=\"com.thinkwu.live:id/et_phone_number\"]')
参考web页面xpath定位总结:http://blog.csdn.net/jojoy_tester/article/details/53453888#t6
备注:APP自动化中使用xpath定位效率相对慢些。
层级定位和list定位
如图:
像这种地方使用一般的定位方式是不行的,一般采用xpath或层级定位。xpath定位效率慢,现在使用层级定位。
从上面两张图看到它们的关系:第2张图是被包含在第1张图片里面的,第一张图id是cn.com.open.mooc:id/sliding_tabs,是第二张图的父节点,
所以:
可以先定位父节点,在定位子节点啦。
e1 = driver.find_element_by_id("cn.com.open.mooc:id/sliding_tabs") #定位到父节点
e2 = e1.find_element_by_class_name("android.widget.LinearLayout") #根据父节点,定位子节点
e3 = e2.find_elements_by_class_name("android.support.v7.a.a$c") #根据父节点,定位子节点
print(e1)
print(e2)
print(e3) #返回的是元素列表
子节点是根据class_name点位的,子节点有多个元素,所以直接点击是不行的。所以层级定位要结合下面的列表定位
:
List定位
list列表是Python里面的一个数组。通过父节点定位到所有的子节点后,子节点被放在一个列表里面。
如上面层级点位:
e1 = driver.find_element_by_id("cn.com.open.mooc:id/sliding_tabs") #先点位到父节点1
e2 = e1.find_element_by_class_name("android.widget.LinearLayout") #点位到父节点2
e3 = e2.find_elements_by_class_name("android.support.v7.a.a$c") #点位到所有子节点,保存到e3列表中
print(e3)
e3[1].click() #提取列表中第2个元素进行点击操作
所以层级定位是需要结合list定位一起使用的。
需要注意的是:定位到父节点时, 需要定位所有的子节点,使用的方法是复数形式:
find_elements_by_xxx()
滑动定位
定位元素时,我们需要查找的元素不在当前屏幕时。如果是web页面的,也可以直接定位(除了iframe那种),但是APP的话,只能定位到当前页面的元素。所以,APP需要滑动。
滑动方式4
滑动方式有:向上、向下、向左、向右。
我们在使用APP时有上面4中滑动方式,我们需要把手机屏幕看成一个坐标系,需要注意的是屏幕的x,y是从左上角开始取的,左上角是坐标原点(0,0),右下角是最大的。
滑动函数4
driver.swipe(x1,y1,x2,y2,t)
(x1,y1)是原始位置,(x2,y2)是滑动到的位置,t是滑动持续时间(单位是毫秒)
- x不变,y值变化======》上下滑动
- y值不变,x变化======》左右滑动
获取屏幕大小
上面的swipe函数直接填入坐标其实也能滑动了,但是每次都需要填入坐标很麻烦,可以通过获取屏幕的大小按比例滑动。
x = driver.get_window_size()['width'] #获取屏幕的宽度,x的最大值
y = driver.get_window_size()['height'] #获取屏幕的高度,y的最大值
滑动的封装函数
封装成一个类,实例化后可以调用。
class TestSwipe():
def __init__(driver):
self.driver = driver
def getsize(self): #获取屏幕的大小
x = self.driver.get_window_size()['width']
y = self.driver.get_window_size()['height']
return (x,y)
#向上滑动(x值不变,y由大变小)
def swipeup(self,t):
l = self.getsize()
x1 = int(l[0]*0.5)
y1 = int(l[1]*0.8)
y2 = int(l[1]*0.3)
return self.driver.swipe(x1,y1,x1,y2,t)
#向下滑动(x值不变,y值由小变大)
def swipedown(self,t):
l = self.getsize()
x1 = int(l[0]*0.5)
y1 = int(l[1]*0.25)
y2 = int(l[1]*0.8)
return self.driver.swipe(x1,y1,x1,y2,t)
#向左滑动(y值不变,x值由大变小)
def swipeleft(self,t):
l = self.getsize()
y = int(l[1]*0.5)
x1 =int(l[0]*0.8)
x2 =int(l[0]*0.1)
return self.driver.swipe(x1,y,x2,y,t)
#向右滑动(y值不变,x值由小变大)
def swiperight(self,t):
l = self.getsize()
y = int(l[1]*0.5)
x1 = int(l[0]*0.2)
x2 = int(l[0]*0.8)
return self.driver.swipe(x1,y,x2,y,t)
app中webview定位
在web中有个iframe,需要切换到iframe才能定位里面的元素,driver.switch_to.frame('id');
在APP中有web页面的,也是不能直接定位的。需要操作webview中的元素,需要切换context才行。
有些情况下不用切换context也能完成操作webview中的元素,好像只是在微博三方登录、qq第三方登录才可以。
获取页面所有的contexts
webviews = driver.contexts #获取所有的contexts
获取页面的contexts报错时,需要考虑:
- APP是否开启debug模式:APP打包时需要开启webview的debug属性setWebContentDebuggingEnabled(true),这个一般是开启的,没有开启的话,叫别人加上就好;就像微信需要开启webview的调试模式。
- 手机是否root:有些手机可以有些就不行,模拟器都可以,这个时候需要将手机root下;
切换webview
driver.switch_to.context('webview的名称')
eg:
webviews = driver.contexts #获取所有的contexts,是一个list
driver.switch_to.context(webviews[-1]) # 切换webview,下面就能定位webview里面的元素了。
webviews是一个列表,在这个list里面有两个元素“NATIVE_APP”,“WEBVIEW_cn_com_open_mooc”,第一个元素是原生的app的contexts,后面的则是webview的context。
切换到webview后就能像web页面那样操作元素了: http://blog.csdn.net/jojoy_tester/article/details/53453888
注意:操作完webview后,也需要切换APP原生的context才能操作APP。
android UIAutomator 定位3