(appium+python)UI自动化_05_appium元素定位_uiautomator万能定位
本文转载:https://www.cnblogs.com/Mushishi_xu/p/7691820.html
android uiautomator text定位
可能有人不知道为什么说android uiautomator是终极定位,而且android uiautomator和appium有什么关系呢?如果之前写了一些脚本,发现有的时候一些元素不能够很好的定位时,那么就需要采用android uiautomator去定位,他是一种非常强有力的定位方式,原理是通过android 自带的android uiautomator的类库去查找元素,都直接用官方公布出来的方法去找了还能找不到吗?
首先看我们下面的图片:
在上面的图片中我们不采用appium封装好的方法,直接使用android 的uiautomator去定位结果如下:
1
2
|
user = new Uiobject(new UiSelector().text( "请输入手机号" )) user.setText( "test" ) |
这两句话看不懂也没关系,因为我们接下来讲的是appium已经对他进行了封装的方法,这里只是让你看一下他原始方法是怎么做的。首先他会根据你的定位信息new一个对象出来,然后再在你new的对象之上进行相关操作。下面我们看一下在appium中的实现方法:
1
2
|
ele = self .driver.find_element_by_android_uiautomator( 'new UiSelector().text("请输入手机号")' ) ele.send_keys( "123" ) |
两个代码进行比较我们可以发现他们的相同之处只是最后的定位信息是一样的,即:new UiSelector().text("请输入手机号")
,这句话是什么意思呢?简单的话就是根据一定条件来查找元素,我们这里的条件就是text属性为“请输入手机号”,再根据图片去理解是不是很容易呢?
android uiautomator的元素定位其实和appium的定位一样,或者说他比appium的定位方式更佳多以及更佳适用,并不是只有这一个,他也只是className、id等定位,而且还支持模糊匹配进行定位,这样是不是感觉更高大上呢?下面我们简单介绍一下这几种定位方式。
6.6.2 uiautomator text模糊定位
模糊定位故名思义,通过text的部分信息就能够进行定位,我们直接看代码:
1
2
|
ele = self .driver.find_element_by_android_uiautomator( 'new UiSelector().textContains("请输入手")' ) ele.send_keys( "123" ) |
在上面的代码中我们只是将.text()的方法变成了.textContains(),在方法中传入模糊的数据就好。看到这里是否有人思考过一个问题,既然有类似的模糊寻找,那么有没有像正则表达式一样的查找呢?答案是肯定的,看我们下面的方法。
6.6.3 textMatches 正则匹配查找
textMatches故名思义就是通过正则的来进行查找定位,他也是通过text的属性来进行正则匹配,我们直接看代码:
1
2
|
ele = self .driver.find_element_by_android_uiautomator( 'new UiSelector().textMatches("^请输入手.*")' ) ele.send_keys( "123" ) |
上面匹配的一些信息可能一些刚做测试的小伙伴不是很了解,这个不要紧,下来可以搜索一下正则表达式教程,稍微了解一下就可以。
6.6.4 uiautomator resourceID定位
resourceId定位和appium封装好的id定位是一样的,只是这里将写法变成了uiautomator的写法而已,看下面代码:
1
2
|
ele = self .driver.find_element_by_android_uiautomator( 'new UiSelector().resourceId("cn.com.open.mooc:id/et_phone_edit")' ) ele.send_keys( '234' ) |
通过上面的代码和之前的代码对比大家可能发现其实他们前面都是一样的,只是在定位的时候发生了一些变化,text变换成了resourceID即可,也就是页面对象属性的信息进行变更了,其他方法都是一样。下面其他方法我就不浪费篇幅,只给大家做一个简单的案例展示。
6.6.5 resourceIDMatches 定位
通过id进行正则匹配定位
1
2
|
ele = self .driver.find_element_by_android_uiautomator( 'new UiSelector().resourceIdMatches(".+et_phone_edit")' ) ele.send_keys( '234' ) |
1
2
3
|
6.6 . 6 uiautomator className定位 通过调用android uiautomator使用className进行定位 |
1
2
|
ele = self .driver.find_element_by_android_uiautomator( 'new UiSelector().className("android.widget.EditText")' ) ele.send_keys( '234' ) |
6.6.7 uiautomator classNameMatches定位
通过className正则匹配进行定位
1
2
|
ele = self .driver.find_element_by_android_uiautomator( 'new UiSelector().classNameMatches (".*EditText")' ) ele.send_keys( '234' ) |
通过上面的学习我相信大家对uiautomator的定位有一定的了解了,但是我想告诉大家的是这个并不是所有的,还有很多很多的定位方式,这个需要大家在以后不断的学习中去积累,我也不可能把所有的方法都告诉大家,这里只是给大家一个起头,但是我希望大家在学习定位的时候不只是看appium的定位,毕竟他也是封装的uiautomator的定位方式,所以在学习appium的同时把uiautomator去大概学习一下这个很有帮助,并且对以后的提升自己以及工作中重新封装appium有很大的帮助。