如何使用 AccessibilityService 查找元素

如何使用 AccessibilityService 查找元素

如果还不了解 AccessibilityService ,先看下这篇:如何使用 AccessibilityService 实现蚂蚁森林自动收取能量,无需Root,无需连接电脑

这里介绍的是用 AccessibilityService 查找元素,可以查找有

1.Id: 也就是我们在xml文件里定义的@+id/xx

2.Text: TextView,Button等View里面内容

3.ContentDescription: 一般View为了无障碍设置的描述,还有很多WebView里面的View显示文字也是用ContentDescription

4.ClassName: 就是View的Class名字,可以找ListView,ViewPager等不常见,一个View里只有一个的

这里我用的是一个叫 Auto.js 的工具来看一个View的元素,自己也一直想实现一个,实在懒,还没动工

Auto.js git地址

伸手党这里直接打包了一个debug包

首先看下 Id 是怎么找的吧,下面用的是支付宝里面的内容,蚂蚁森林这个View的所有属性

他的fullId就是相应的全部的 id 了,只要查找就能找到

下面是查找 Id 的源码,其实可以 AccessibilityNodeInfo 直接查找Id的方式查找

List<AccessibilityNodeInfo> list = root.findAccessibilityNodeInfosByViewId(mCheckData);
if (Utils.isEmptyArray(list)) {
    return null;
}
for (int i = 1; i < list.size(); i++) {//其他的均回收
    list.get(i).recycle();
}
return list.get(0);

上面的“蚂蚁森林”元素,其实也可以通过查找 Text 的方式找到

下面是查找 Text 的源码,也可以 AccessibilityNodeInfo 直接找Text的方式查找

List<AccessibilityNodeInfo> list = root.findAccessibilityNodeInfosByText(mCheckData);
if (Utils.isEmptyArray(list)) {
    return null;
}

AccessibilityNodeInfo returnInfo = null;
for (AccessibilityNodeInfo info : list) {
    if (mCheckData.equals(info.getText().toString())) {
        returnInfo = info;
    } else {
        info.recycle();
    }
}
return returnInfo;

再来看下 ContentDescription 是在哪里的吧

下面是查找 ContentDescription 的源码,通过递归的方式找ContentDescription

CharSequence text = thisInfo.getContentDescription();
return text != null && text.toString().equals(mCheckData);

下面是查找 WebText 和 ClassName 的源码,都是通过递归的方式找的

// WebText是
CharSequence text = thisInfo.getText();
return text != null && text.toString().equals(mCheckData);


// ClassName 查找
return thisInfo.getClassName().toString().equals(mCheckData);

最后附上完整demo的地址,里面封装了所有查找元素的方法,还根据自动领取蚂蚁森林举了个例子:蚂蚁森林自动领取能量

发布了29 篇原创文章 · 获赞 3 · 访问量 1120

猜你喜欢

转载自blog.csdn.net/qq_16927853/article/details/103357731
今日推荐