1.1 问题现象
-
当使用自带的
uiautomatorviewer.bat
连接真机时,提示以下报错:
-
原因是我连接的是真机,而操作系统是
Android13
,但是自带的uiautomatorviewer
不支持Android8.0
之后的操作系统了。
1.2 解决方法
1.2.1 方法一:使用第三方文件(不建议)
-
使用二次开发好的
uiautomatorviewer
,本文试过了安卓9.0可以,但是安卓13是不行的; -
这个可以直接搜索,比如如下这个:
-
下载后有三个文件,
uiautomatorviewer.jar
和uiautomatorviewer.jar2
属于同一个文件只是页面功能略有不同,一次只可使用一个,不管下载那个最后必须重命名为uiautomatorviewer.jar
; -
进入
SDK
目录的D:\android-sdk-windows\tools\lib
目录下,找到老的uiautomatorviewer.jar
重新命名uiautomatorviewer.zip
或者移动到其他地方去; -
将下载好的
uiautomatorviewer.jar
、uiautomatorviewer.jar2
复制到D:\android-sdk-windows\tools\lib
目录下:
-
将下载好的
LvmamaXmlKit.jar
上传到手机:
F:\monkey_test>adb push LvmamaXmlKit.jar /sdcard/
LvmamaXmlKit.jar: 1 file pushed, 0 skipped. 0.0 MB/s (1118 bytes in 0.027s)
-
重新尝试可以连接了(安卓9可以,安卓13不行):
1.2.2 方法二:导入uix和png文件
-
使用以下命令截取
uix
文件,保存到手机中:
adb shell uiautomator dump /sdcard/an.uix
-
将手机中的
uix
文件下载到本地:
adb pull /sdcard/an.uix
-
使用以下命令截取
png
文件,保存到手机中:
adb shell screencap -p /sdcard/an.png
-
将手机中的
png
文件下载到本地:
adb pull /sdcard/an.png
-
打开
uiautomatorviewer
后,导入这两个本地文件即可:
2 accessibility_id定位说明
-
accessibility_id
定位主要使用的是元素的content-desc
内容; -
元素的
content-desc
主要是针对的是Android
; -
而
iOS
上用的是label
或name
属性; -
比如安卓上的如下:
3 accessibility_id定位方式
-
accessibility_id
定位方式方式直接使用的方法是:
AppiumBy.ACCESSIBILITY_ID
-
源码中是这么写的:
class AppiumBy(By):
IOS_PREDICATE = '-ios predicate string'
IOS_UIAUTOMATION = '-ios uiautomation'
IOS_CLASS_CHAIN = '-ios class chain'
ANDROID_UIAUTOMATOR = '-android uiautomator'
ANDROID_VIEWTAG = '-android viewtag'
ANDROID_DATA_MATCHER = '-android datamatcher'
ANDROID_VIEW_MATCHER = '-android viewmatcher'
# Deprecated
WINDOWS_UI_AUTOMATION = '-windows uiautomation'
ACCESSIBILITY_ID = 'accessibility id' # 用的是这个
IMAGE = '-image'
CUSTOM = '-custom'
-
示例比如:
driver.find_element(AppiumBy.ACCESSIBILITY_ID, "Browser").click()
4 bounds坐标定位说明
-
关于坐标定位,能不用就不用,为啥呢?
-
我们之前提供了很多的定位方式,但是有时候需要用坐标才能定位到;
-
但是使用坐标定位很不稳定,它和手机的分辨率、屏幕尺寸等有关系;
-
这样同一套代码可能在不同的机器上运行不下去,需要投入大量的人力进行代码修改优化,很是麻烦;
-
坐标定位使用的是元素的
bounds
属性; -
在
uiautomatorviewer
的最后一行:
-
这个坐标有两对,分别代表是按钮左上角的坐标和按钮右下角的坐标。
5 bounds坐标定位方式
-
bounds
坐标定位方式为:
driver.tap()
-
这个
tap()
使用如下:
def tap(self, positions: List[Tuple[int, int]], duration: Optional[int] = None) -> 'WebDriver':
"""Taps on an particular place with up to five fingers, holding for a
certain time
Args:
positions: an array of tuples representing the x/y coordinates of
the fingers to tap. Length can be up to five.
duration: length of time to tap, in ms
Usage:
driver.tap([(100, 20), (100, 60), (100, 100)], 500)
Returns:
Union['WebDriver', 'ActionHelpers']: Self instance
"""
-
所以示例为:
driver.tap([(605,1022), (739,1178)], duration=50)
6 uiautomator定位简介
-
uiautomator
是Android
原生的定位方式; -
相对于以前提及的定位方式它的优势是功能比较强大,速度快;
-
定位样式和
xpath
差不多,支持元素的全部属性定位; -
定位方法为:
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, "xxx")
-
而传入的参数为一个
java
对象,对象是UiSelector
对象。
7 UiSelector对象API
-
UiSelector
对象可以参考:UiSelector
; -
关于
UiSelector
对象API
有以下内容:
8 uiautomator定位示例
8.1 text方法
-
text
有四种,详见上边提到的API
; -
比如我们对某个元素属性文本是新增,我们使用
text
定位:
add_text = 'new UiSelector().text("新增")'
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, add_text).click()
add_text01 = 'new UiSelector().textContains("新")'
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, add_text01).click()
8.2 resourceID方法
-
直接将
resourceID
整个内容,而不是属性名;
id_ele = 'resourceId("com.taobao.taobao:id/provision_positive_button")'
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, id_ele).click()
8.3 其他方法
-
关于其他方式也是类似的,比如
className
、组合定位、父子定位等。
行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群: 786229024,里面有各种测试开发资料和技术可以一起交流哦。
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。