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
- 连接Android设备,通过命令行
adb devices
查看确保设备已连接。 - 使用浏览器打开 Appium Inspector
- 在Appium Inspector页面中的
JSON Representation
输入以下参数
{
"platformName": "Android",
"appium:deviceName": "Android Emulator",
"appium:automationName": "UiAutomator2"
}
4. 点击
Start Session
正常会打开下面这个界面
这时我们已经准备好了环境准备,接下来可以去实现我们的自动化脚本了
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) {
}
}
实现具体步骤
分析自动化步骤,很简单
- 输入账号
- 输入密码
- 点击登录
想要输入账号首先需要获取节点元素,通过前面配置好的Appium来抓取
- 打开微信登录页面
- 刷新Appium Inspector
3. 点击账号输入框复制节点id值:
com.tencent.mm:id/d98
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
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