Appium基础学习之 | ANDROID_UIAUTOMATOR定位介绍

 

Appium实现自动化底层是依赖UiAutomator框架,定位元素也是经由UiAutomator处理后转换Accessibility服务对象完成元素查找并且操作。在前面介绍过Appium-Desktop支持的ID、XPATH、ACCESSIBILITY_ID、CLASS_Name定位,对于这四种定位比较容易理解,剩下的ANDROID_UIAUTOMATOR定位在这篇文章介绍。

一、疑问

对于ANDROID_UIAUTOMATOR的使用出于自己的2个疑问

1.为什么Appium-Desktop不支持非常实用的NAME定位?

2.ANDROID_UIAUTOMATOR这种定位方式的价值有多大?

二、ANDROID_UIAUTOMATOR定位使用

对于Appium来说支持ANDROID_UIAUTOMATOR花费的代码量比ID、ACCESSIBILITY_ID、CLASS_Name加起来都多N倍,对于支持ID、ACCESSIBILITY_ID、CLASS_Name非常简单,直接把入参的String内容传入到UiAutomator对应的方法就搞定,但是对于ANDROID_UIAUTOMATOR就需要一大堆的代码处理,看下面代码:

if (by instanceof ById) {
    String locator = rewriteIdLocator((ById) by);
    return CustomUiDevice.getInstance().findObject(androidx.test.uiautomator.By.res(locator));
} else if (by instanceof By.ByAccessibilityId) {
    return CustomUiDevice.getInstance().findObject(androidx.test.uiautomator.By.desc(by.getElementLocator()));
} else if (by instanceof ByClass) {
    return CustomUiDevice.getInstance().findObject(androidx.test.uiautomator.By.clazz(by.getElementLocator()));
} else if (by instanceof By.ByXPath) {
    final NodeInfoList matchedNodes = getXPathNodeMatch(by.getElementLocator(), null, false);
    if (matchedNodes.isEmpty()) {
        throw new ElementNotFoundException();
    }
    return CustomUiDevice.getInstance().findObject(matchedNodes);
} else if (by instanceof By.ByAndroidUiAutomator) {
    UiSelector selector = toSelector(by.getElementLocator());
    if (selector == null) {
        throw new UiSelectorSyntaxException(by.getElementLocator(), "");
    }
    return CustomUiDevice.getInstance().findObject(selector);
}

从源码来看ID、ACCESSIBILITY_ID、CLASS_Name这些都是UiAutomator支持的定位方式,唯有XPATH、ANDROID_UIAUTOMATOR是需要经常特殊处理的;ANDROID_UIAUTOMATOR的定位经过ElementLocationHelpers、UiAutomatorParser、UiScrollableParser、UiSelectorParser、UiExpressionParser这5个类的一系列方法逐渐分解,最终返回用户想要定位的元素对象(XPATH的源码分析就不在这篇文章叙述),举例说明:

driver.findElementByAndroidUIAutomator("new UiSelector().resourceId(\"android:id/content\").childSelector(new UiSelector().resourceId(\"ymxh.main:id/user_name\"))");

Appium Server需要把入参的String分解,先拿到new UiSelector()通过反射得到该UiSelector对象,再通过反射去调用它的resourceId方法、childSelector方法;有兴趣可以自己去研究一下Appium Server的源码。

1.Text定位

Appium-Desktop已经不支持Name的定位方式,但是使用ANDROID_UIAUTOMATOR依然可以间接的通过text属性来定位元素,这或许就是为什么Appium-Desktop可以放弃Name定位方法的考虑,从上面举例也可以看出ANDROID_UIAUTOMATOR其实可以完全替代ID、ACCESSIBILITY_ID、CLASS_Name方法。

new UiSelector().text("text文本")

new UiSelector().textContains("包含text文本")

new UiSelector().textStartsWith("以text文本开头")

new UiSelector().textMatches("正则表达式")

2.resourceId

new UiSelector().resourceId("id")

3.className

new UiSelector().className("className")

4.description

new UiSelector().description("contenet-des属性")

5.childSelector

父元素下找子元素

new UiSelector().resourceId("ymxh.main.id/spinner_job").childSelector(new UiSelector().resourceId("android:id/text1"))

6.cfromParent

同层元素

new UiSelector().resourceId("ymxh.main.id/webui_auto").childSelector(new UiSelector().resourceId("ymxh.main.id/interf_auto"))

当然使用ANDROID_UIAUTOMATOR定位方式可以非常灵活方便,只要是符合UiAutomator风格的定位都可以使用,想了解更多方法可以参考一下UiAutomator源码中UiSelector类支持的方法,选择使用。文中只介绍了常见的一些方法,请谅解。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
UIAutomator元素定位Android系统原生支持的定位方式,通过使用android自带的android uiautomator的类库去查找元素。它比其他定位方式更加灵活且支持元素的全部属性定位。在Appium中,也是基于UIAutomator进行封装的。使用方法find_element_by_android_uiautomator()可以运用UIAutomator元素定位定位方法包括id定位、text定位和class name定位。此外,UIAutomator还支持递归地搜索元素,是一种强有力的定位方式。在Appium中,可以通过实例化一个UiSelector对象并通过实例接口调用来定位元素。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Appium学习18:Uiautomator元素定位](https://blog.csdn.net/up1292/article/details/104192339)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Appium元素定位方式之android_uiautomator定位](https://blog.csdn.net/weixin_44740756/article/details/120175915)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值