appium+Python 常见元素定位方法
辅助工具
Android SDK在4.1中提供了如下工具来支持UI自动化测试:uiautomatorviewer – 一个图形界面工具来扫描和分析应用的UI控件。
在sdk\tools\bin目录下,有一个UIAutomatorviewer.bat文件,双击打开,如下图(用于查找元素)
定位元素的方法:
根据resource-id定位:唯一,定位精确
driver.find_element_by_id()
根据text定位:
driver.find_element_by_name()
根据class定位:注意class不是唯一
driver.find_element_by_class_name()
根据content-desc定位:
driver.find_element_by_accessibility_id()
根据xpath定位:
driver.find_element_by_xpath()
可以看到我的这张图片中,有xpath这一行,但是原生的UIAutomatorviewer是没有的。图片中的是LazyUiAutomatorViewer。
LazyUiAutomatorViewer是在UiAutomatorViewer源码基础上进行扩展,添加了xpath生成,页面xpath自动一键抓取导出、选择性抓取导出并自动生成java代码的安卓UI自动化测试辅助工具。
将LazyUiAutomatorViewer 源码编译生成的jar包uiautomatorviewer.jar拷贝到安卓安装目录下的 \android-sdk\tools\lib 文件夹中替换掉原来的uiautomatorviewer.jar包。
源码及jar包的下载地址:https://github.com/lazytestteam/lazyuiautomatorviewer; 双击安卓安装目录下的 \android-sdk\tools\uiautomatorviewer.bat 文件,启动LazyUiAutomatorViewer 。
根据uiautomator定位(不记得从哪位大牛处整理过来的资料)
driver.find_element_by_android_uiautomator()
1. uiautomator text模糊定位
模糊定位故名思义,通过text的部分信息就能够进行定位,我们直接看代码:
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().textContains("请输入手")')
ele.send_keys("123")
在上面的代码中我们只是将.text()的方法变成了.textContains(),在方法中传入模糊的数据就好。看到这里是否有人思考过一个问题,既然有类似的模糊寻找,那么有没有像正则表达式一样的查找呢?答案是肯定的,看我们下面的方法。
2. textMatches 正则匹配查找
textMatches故名思义就是通过正则的来进行查找定位,他也是通过text的属性来进行正则匹配,我们直接看代码:
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().textMatches("^请输入手.*")')
ele.send_keys("123")
上面匹配的一些信息可能一些刚做测试的小伙伴不是很了解,这个不要紧,下来可以搜索一下正则表达式教程,稍微了解一下就可以。
3. uiautomator resourceID定位
resourceId定位和appium封装好的id定位是一样的,只是这里将写法变成了uiautomator的写法而已,看下面代码:
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即可,也就是页面对象属性的信息进行变更了,其他方法都是一样。下面其他方法我就不浪费篇幅,只给大家做一个简单的案例展示。
4. resourceIDMatches 定位
通过id进行正则匹配定位
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().resourceIdMatches(".+et_phone_edit")')
ele.send_keys('234')
5.uiautomator className定位
通过调用android uiautomator使用className进行定位
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.EditText")')
ele.send_keys('234')
6. uiautomator classNameMatches定位
通过className正则匹配进行定位
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().classNameMatches (".*EditText")')
ele.send_keys('234')