1 uiautomatorviewer无法衔接手机
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-windowstoolslib目录下,找到老的uiautomatorviewer.jar重新命名uiautomatorviewer.zip或许移动到其他地方去; - 将下载好的
uiautomatorviewer.jar 、uiautomatorviewer.jar2复制到D:android-sdk-windowstoolslib目录下:
- 将下载好的
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
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有以下内容:
| API | 阐明 |
|---|---|
checked(boolean val) |
设置查找条件以匹配当时选中的小部件(一般用于复选框) |
childSelector(UiSelector selector) |
将子UiSelector条件增加到此选择器。 |
className(String className) |
设置查找条件以匹配小部件的类特点(例如,“android.widget.Button”) |
className(Class<T> type) |
设置查找条件以匹配小部件的类特点(例如,“android.widget.Button”)
|
classNameMatches(String regex) |
设置查找条件以匹配小部件的类特点(例如,“android.widget.Button”)
|
clickable(boolean val) |
设置查找条件以匹配可单击的小部件 |
description(String desc) |
设置查找条件以匹配小部件的内容描绘特点 |
descriptionContains(String desc) |
设置查找条件以匹配小部件的内容描绘特点 |
descriptionMatches(String regex) |
设置查找条件以匹配小部件的内容描绘特点 |
descriptionStartsWith(String desc) |
设置查找条件以匹配小部件的内容描绘特点 |
enabled(boolean val) |
设置查找条件以匹配已启用的小部件 |
focusable(boolean val) |
设置查找条件以匹配可聚焦的小部件 |
focused(boolean val) |
设置查找条件以匹配具有焦点的小部件 |
fromParent(UiSelector selector) |
将子UiSelector条件增加到此选择器,用于从父小部件开端查找 |
index(int index) |
设置查找条件,以通过布局层次结构中的节点索引匹配小部件 |
instance(int instance) |
设置查找条件以按小部件的实例号匹配小部件 |
longClickable(boolean val) |
设置查找条件以匹配可长期单击的小部件 |
packageName(String name) |
设置查找条件以匹配包括小部件的运用程序的包称号 |
packageNameMatches(String regex) |
设置查找条件以匹配包括小部件的运用程序的包称号 |
scrollable(boolean val) |
设置查找条件以匹配可翻滚的小部件 |
selected(boolean val) |
设置查找条件以匹配当时选择的小部件 |
text(String text) |
设置查找条件以匹配小部件显现的可见文本(例如,发动运用程序的文本标签) |
textContains(String text) |
设置查找条件以匹配小部件显现的可见文本(例如,发动运用程序的文本标签) |
textMatches(String regex) |
设置查找条件以匹配小部件显现的可见文本(例如,发动运用程序的文本标签) |
textStartsWith(String text) |
Text特点一般是小部件在显现器上的可见文本 |
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、组合定位、父子定位等。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。


