app自动化测试5---定位元素方法

常用识别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













































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值