1 uiautomatorviewer无法衔接手机

1.1 问题现象

  • 当运用自带的uiautomatorviewer.bat衔接真机时,提示以下报错:
    『App自动化测验之Appium运用篇』| uiautomator + accessibility_id定位办法彻底运用攻略
  • 原因是我衔接的是真机,而操作系统Android13,可是自带的uiautomatorviewer不支撑Android8.0之后的操作系统了。

1.2 解决办法

1.2.1 办法一:运用第三方文件(不主张)

  • 运用二次开发好的uiautomatorviewer,本文试过了安卓9.0能够,可是安卓13是不行的;
  • 这个能够直接查找,比方如下这个:
    『App自动化测验之Appium运用篇』| uiautomator + accessibility_id定位办法彻底运用攻略
  • 下载后有三个文件,uiautomatorviewer.jaruiautomatorviewer.jar2归于同一个文件仅仅页面功用略有不同,一次只可运用一个,不管下载那个最终有必要重命名为uiautomatorviewer.jar
  • 进入SDK目录的D:android-sdk-windowstoolslib目录下,找到老的uiautomatorviewer.jar重新命名uiautomatorviewer.zip或许移动到其他地方去;
  • 将下载好的uiautomatorviewer.jar 、uiautomatorviewer.jar2复制到D:android-sdk-windowstoolslib目录下:
    『App自动化测验之Appium运用篇』| uiautomator + accessibility_id定位办法彻底运用攻略
  • 将下载好的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

『App自动化测验之Appium运用篇』| uiautomator + accessibility_id定位办法彻底运用攻略

  • 打开uiautomatorviewer后,导入这两个本地文件即可:
    『App自动化测验之Appium运用篇』| uiautomator + accessibility_id定位办法彻底运用攻略

2 accessibility_id定位阐明

  • accessibility_id定位主要运用的是元素的content-desc内容;
  • 元素的content-desc主要是针对的是Android
  • iOS上用的是labelname特点;
  • 比方安卓上的如下:
    『App自动化测验之Appium运用篇』| uiautomator + accessibility_id定位办法彻底运用攻略

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的最终一行:
    『App自动化测验之Appium运用篇』| uiautomator + accessibility_id定位办法彻底运用攻略
  • 这个坐标有两对,分别代表是按钮左上角的坐标和按钮右下角的坐标。

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定位简介

  • uiautomatorAndroid原生的定位办法;
  • 相对于曾经提及的定位办法它的优势是功用比较强壮,速度快;
  • 定位款式和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、组合定位、父子定位等。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。