Appium结合AccessibilityService实现自动化微信登录

1,038 阅读4分钟

1. 介绍

在 Android 设备上进行自动化操作时,可以使用 Appium 获取 UI 元素的节点信息,使用基于 AccessibilityService 封装的框架Assists快速实现自动点击、滑动等操作。本教程将介绍如何使用 Appium 获取 Android 界面元素,并通过 Assists 实现简单的微信登录的自动化操作。

2. 环境准备

2.1 安装 Appium

首先,需要在本地安装 Appium。

安装Appium之前需要先安装好node.js,版本需要>=18.0.0

安装好node.js之后就可以通过npm安装Appium了

npm install -g appium
appium -v # 检查安装版本

2.2 安装必要的依赖

  • Android SDK
  • Java JDK
  • uiautomator2 驱动

这个教程默认Android相关的开发环境已经配置好,如果还没Android开发环境的可自定搜索先配置下Android环境

接下来使用appium直接安装uiautomator2

appium driver install uiautomator2

2.3 启动 Appium

appium server --allow-cors

3. 使用 Appium 获取 Android 界面节点信息

3.1 连接设备并使用浏览器打开 Appium Inspector

  1. 连接Android设备,通过命令行 adb devices 查看确保设备已连接。
  2. 使用浏览器打开 Appium Inspector
  3. Appium Inspector页面中的JSON Representation输入以下参数
{
  "platformName": "Android",
  "appium:deviceName": "Android Emulator",
  "appium:automationName": "UiAutomator2"
}

image.png 4. 点击Start Session正常会打开下面这个界面 image.png

这时我们已经准备好了环境准备,接下来可以去实现我们的自动化脚本了

4. 集成Assists快速实现微信自动登录

1. 创建Android项目

创建Android项目就忽略了,请自行搜索资料

2. 集成Assists

项目根目录build.gradle添加

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

allprojects {
    repositories {
	//添加jitpack仓库
        maven { url 'https://jitpack.io' }
    }
}

主模块build.gradle添加

    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 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>
实现微信自动化步骤
继承StepImpl
class WeChatLoginAuto: StepImpl() {
    override fun onImpl(collector: StepCollector) {

    }
}
实现具体步骤

分析自动化步骤,很简单

  1. 输入账号
  2. 输入密码
  3. 点击登录

想要输入账号首先需要获取节点元素,通过前面配置好的Appium来抓取

  1. 打开微信登录页面
  2. 刷新Appium Inspector

image.png 3. 点击账号输入框复制节点id值:com.tencent.mm:id/d98

image.png 4. 代码实现获取节点并输入账号

class WeChatLoginAuto: StepImpl() {
    override fun onImpl(collector: StepCollector) {
        collector.next(stepTag = 1){
            //第1步

            //通过id查找并使用第1个节点元素输入账号:x63998
            AssistsCore.findById("com.tencent.mm:id/d98").firstOrNull()?.setNodeText("x69398")

            //执行第2步
            return@next Step.get(2)
        }
    }
}

5. 点击密码输入框复制节点id值:com.tencent.mm:id/d98

image.png 6. 实现输入密码

我们发现密码输入框节点id值和账号输入框节点id值一样,所以我们通过AssistsCore.findById需要拿第二个节点元素去操作输入

class WeChatLoginAuto: StepImpl() {
    override fun onImpl(collector: StepCollector) {
        collector.next(stepTag = 1){
            //第1步

            //通过id查找并使用第1个节点元素输入账号:x63998
            AssistsCore.findById("com.tencent.mm:id/d98").firstOrNull()?.setNodeText("x69398")

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

            //通过id查找并使用第2个节点元素输入密码:xxx
            //因为账号输入框节点元素id和密码输入框节点元素id相同,所以需要使用getOrNull(1)获取第2个节点元素
            AssistsCore.findById("com.tencent.mm:id/d98").getOrNull(1)?.setNodeText("xxx")

            //执行第3步
            return@next Step.get(3)
        }
    }
}

7. 最后按照前面的步骤获取登录按钮的id实现点击登录

class WeChatLoginAuto: StepImpl() {
    override fun onImpl(collector: StepCollector) {
        collector.next(stepTag = 1){
            //第1步

            //通过id查找并使用第1个节点元素输入账号:x63998
            AssistsCore.findById("com.tencent.mm:id/d98").firstOrNull()?.setNodeText("x69398")

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

            //通过id查找并使用第2个节点元素输入密码:xxx
            //因为账号输入框节点元素id和密码输入框节点元素id相同,所以需要使用getOrNull(1)获取第2个节点元素
            AssistsCore.findById("com.tencent.mm:id/d98").getOrNull(1)?.setNodeText("xxx")

            //执行第3步
            return@next Step.get(3)
        }.next(stepTag = 3){
            //第3步

            //通过id查找登录按钮并点击
            AssistsCore.findById("com.tencent.mm:id/iol").firstOrNull()?.click()

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

执行

执行前需要把Appium服务给关闭

StepManager.execute(WeChatLoginAuto::class.java, stepTag = 1, begin = true)

停止执行

StepManager.isStop = true

最终效果

Kapture 2025-03-19 at 23.35.31.gif

总结

  1. 配置Appium
  2. 集成Assists
  3. 通过Appium查看节点信息
  4. 使用AssistsAPI通过节点信息id获取元素并执行自动化逻辑

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