AccessibilityService-weditor获取节点元素信息&Assists实现自动化

1. weditor 简介

在使用AccessibilityService开发自动化工具或自动化测试脚本时需要知道控件属性才能自动化逻辑。weditor 是一个用于 Android UI 自动化测试的可视化工具,它提供一个 Web 界面,方便查看 Android 设备 UI 层级、获取控件属性。

2. 安装前的准备

在安装 weditor 之前,需要先安装以下依赖环境:

2.1 安装 Python

weditor 依赖 Python 运行环境,建议使用 Python 3.6 及以上版本。

  • 在 Windows 上,可以从 Python 官网 下载并安装。

  • 在 macOS/Linux 上,可以使用包管理工具安装,如:

    bash 复制代码
    sudo apt install python3  # Ubuntu/Debian
    brew install python3  # macOS

3. 安装 weditor

使用 pip 命令安装 weditor

复制代码
pip install -U weditor

安装完成后,可以通过以下命令检查是否安装成功:

bash 复制代码
weditor --help

如果输出帮助信息,则说明安装成功。

4. 连接 Android 设备

4.1 启用 USB 调试模式

在手机上开启 开发者模式 并启用 USB 调试

4.2 连接设备

通过 USB 连接手机,并运行以下命令查看设备是否被识别:

复制代码
adb devices

如果设备列表中显示了设备编号,则表示连接成功。

5. 启动 weditor

在终端执行以下命令启动 weditor

复制代码
weditor

默认情况下,它会在 localhost:17310 启动一个 Web 服务器。在浏览器中访问:

arduino 复制代码
http://localhost:17310

即可打开 weditor 界面,并且显示手机当前的界面即可查看节点元素信息,如下:

6. 使用Assists实现简单自动点击和输入

Assists是一个基于AccessibilityService封装的开发框架,主要是为了简化自动化脚本开发、提供增强能力、提高代码易维护性的一个框架。

6.1集成Assists

项目根目录build.gradle添加

以下是Groovy DSL写法,Kotlin DSL的可GPT问下

rust 复制代码
allprojects {
    repositories {
	//添加jitpack仓库
        maven { url 'https://jitpack.io' }
    }
}

主模块build.gradle添加

arduino 复制代码
    dependencies {
        //按需添加
        //基础库(必须)
        implementation "com.github.ven-coder.Assists:assists-base:v3.2.11"
        //屏幕录制相关(可选)
        implementation "com.github.ven-coder.Assists:assists-mp:v3.2.11"
        //opencv相关(可选)
        implementation "com.github.ven-coder.Assists:assists-opcv:v3.2.11"
    }

主模块AndroidManifest.xml中注册服务

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.ven.assists.simple">

    <application
        android:name="com.ven.assists.simple.App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:requestLegacyExternalStorage="true"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true">
        
        <!-- 添加代码 ↓-->
        <service
            android:name="com.ven.assists.service.AssistsService"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
            <!--android:priority="10000" 可提高服务在设置中的权重,排在前面-->
            <intent-filter android:priority="10000">
                <action android:name="android.accessibilityservice.AccessibilityService" />
            </intent-filter>
            <meta-data
                android:name="android.accessibilityservice"
                android:resource="@xml/assists_service" />
        </service>
        <!-- 添加代码 ↑-->
        
    </application>

</manifest>

6.2 实现点击微信搜索并输入搜索内容

6.2.1 获取微信搜索节点元素id

注意: 选中的搜索节点的clickable需要是true才行,代表该节点是可点击的

6.2.2 实现点击

kotlin 复制代码
class SimpleStep: StepImpl() {
    override fun onImpl(collector: StepCollector) {
        collector.next(stepTag = 1){
            //第1步

            "点击搜索".overlayToast()
            delay(1000)
            AssistsCore.findById("com.tencent.mm:id/jha").firstOrNull()?.click()

            //执行第2步
            return@next Step.get(2, delay = 2000)
        }
    }
}

6.2.3 查找输入框并输入文字

除了可以通过id获取节点,还可以通过节点类型获取

6.2.4 实现输入

kotlin 复制代码
class SimpleStep: StepImpl() {
    override fun onImpl(collector: StepCollector) {
        collector.next(stepTag = 1){
            //第1步

            "点击搜索".overlayToast()
            delay(1000)
            AssistsCore.findById("com.tencent.mm:id/jha").firstOrNull()?.click()

            //执行第2步
            return@next Step.get(2, delay = 2000)
        }.next(stepTag = 2){
            //第2步

            "输入搜索内容".overlayToast()
            delay(1000)

            AssistsCore.findByTags("android.widget.EditText").firstOrNull()?.setNodeText("自动输入的搜索内容")

            //结束执行
            return@next Step.none
        }
    }
}

最终效果

教程源码:github.com/ven-coder/a...

相关推荐
程序员黑豆2 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
To_OC3 小时前
踩了个 TS 的坑之后,我终于把 type 和 interface 掰明白了
前端·react.js·typescript
GreenTea3 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
浮生望3 小时前
前端API工程化:用 Mock 数据与 Axios 配置实现独立于后端的并行开发
前端
万少4 小时前
给 DeepSeek Harness 装个"应用商店":一条命令,595 个插件随你逛
前端·javascript·后端
波波0074 小时前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#
Brown.alexis5 小时前
es6知识点1-自备使用
前端·ecmascript·es6
小爬的老粉丝6 小时前
JavaScript 纯前端预览 WPS:先识别容器,再路由解析器
前端·javascript·wps
计算机魔术师6 小时前
新兴多智能体系统的模式与问题
前端
用户059540174467 小时前
AI Agent 上下文污染踩坑实录:用 pytest + Redis 揪出 3 类记忆串号 bug,排查 6 小时
前端·css