Midscene 低代码实现Android自动化
一、传统Android自动化的挑战
传统Android自动化主要依赖于如UiAutomator、Espresso等框架。这些框架虽然在一定程度上实现了应用操作的自动化,但存在不少痛点。
- 复杂的脚本编写:开发人员需要深入掌握编程语言(如Java或Kotlin)以及特定自动化框架的API。例如,使用UiAutomator定位界面元素时,需精确编写基于资源ID、类名、坐标等复杂选择器。假设要点击一个按钮,代码可能如下:
UiObject2 button = device.findObject(By.res("com.example.app:id/button_id"));
if (button != null) {button.click();
}
这对于非专业开发人员或快速迭代的项目而言,编写和维护成本极高。
2. 脆弱的稳定性:界面的微小变化,如元素ID变更、布局调整,都可能导致自动化脚本失效。以一个简单的登录页面为例,若用户名输入框的ID从“username_input”改为“login_username_input”,所有依赖该ID的自动化脚本都需修改,否则无法正常运行。
3. 元素定位困难:面对复杂的UI结构,尤其是嵌套层级多、元素特征不明显的情况,传统定位方式难以精准找到目标元素。在一个包含多个相似列表项的页面中,准确点击特定列表项内的某个按钮,常常需要编写冗长且易错的遍历逻辑。
二、Midscene带来的革新
Midscene作为一款先进的自动化工具,有效克服了上述难题,具有以下显著优势:
- 自然语言交互:Midscene允许用户使用自然语言描述自动化任务,极大降低了编写门槛。例如,只需写下“打开淘宝应用,搜索手机,点击搜索结果中的第一个商品”,Midscene就能理解并执行相应操作,无需复杂代码编写。
- 强大的适应性:借助多模态AI推理能力,Midscene对界面变化有更强的适应性。即使界面元素ID、布局改变,只要其功能和视觉特征相对稳定,Midscene仍能基于语义理解找到目标元素并执行操作。
- 高效的元素识别:通过先进的视觉语言模型,Midscene能够快速且准确地识别屏幕上的各种元素,无论是标准UI组件还是自定义视图,都能精准定位,大大提高了自动化操作的准确性和效率。
三、Midscene实现Android自动化的具体步骤
安装 Node.js
安装 Node.js 18 或以上版本。
准备 API Key
准备一个视觉语言(VL)模型的 API Key。
你可以在 选择 AI 模型 文档中查看 Midscene.js 支持的模型和配置。
安装 adb
adb
是一个命令行工具,允许你与 Android 设备通信。有两种安装 adb
的方法:
- 方法 1:使用 Android Studio 安装
- 方法 2:使用 Android 命令行工具 安装
验证 adb
是否安装成功:
adb --version
当你看到以下输出时,表示 adb
安装成功:
Android Debug Bridge version 1.0.41
Version 34.0.4-10411341
Installed as /usr/local/bin//adb
Running on Darwin 24.3.0 (arm64)
设置环境变量 ANDROID_HOME
参考Android 环境变量,设置环境变量 ANDROID_HOME
。
验证 ANDROID_HOME
变量是否设置成功:
echo $ANDROID_HOME
当上述命令有输出时,表示 ANDROID_HOME
变量设置成功:
/Users/your_username/Library/Android/sdk
连接 Android 设备
在 Android 设备的开发者选项中,启用 ‘USB 调试’,如果存在 ‘USB 调试(安全设置)’,也启用它,然后使用 USB 线连接 Android 设备。
验证连接:
adb devices -l
当看到以下输出时,表示连接成功:
List of devices attached
s4ey59 device usb:34603008X product:cezanne model:M2006J device:cezan transport_id:3
配置 AI 模型服务
将你的模型配置写入环境变量。更多信息请查看 选择 AI 模型。
# 替换为你的 API Key
export OPENAI_API_KEY="sk-abcdefghijklmnopqrstuvwxyz"# 可能需要更多配置,如模型名称、接入点等,请参考 《选择 AI 模型》文档
export OPENAI_BASE_URL="..."
创建 yaml文件
下面是一个登录WPS office的用例
android:deviceId: xxxxxtimeout: 30000 # 全局超时时间设置为30秒tasks:- name: 打开WPS Office并登录flow:- ai: 打开WPS Office应用wait: 5000 # 等待应用启动# 导航至登录页面(增加状态检查)- ai: 点击底部导航栏的"我"选项wait: 2000retry: 2onError:- ai: 等待界面加载完成wait: 5000- ai: 再次点击底部导航栏的"我"选项wait: 2000- aiAssert: 验证界面出现立即登录文案timeout: 8000- ai: 点击"立即登录"选项wait: 3000retry: 3- ai: 勾选"已阅读并同意金山办公在线协议服务端和WPS隐私政策"选项,注意勾选时点击圆圈勾选wait: 3000retry: 4- ai: 点击三个点"..."选项wait: 2000retry: 3- ai: 点击"账号密码"登录选项wait: 5000- ai: 点击"手机号或邮箱"输入框wait: 2000- ai: 在输入框中输入"xxx"wait: 2000- ai: 点击"密码"输入框wait: 2000- ai: 在密码输入框中输入"xxx"wait: 2000# 智能验证与登录流程- ai: 点击"点击按钮开始智能验证"按钮wait: 10000retry: 2- ai: 点击"立即登录"按钮wait: 8000retry: 1- ai: 点击"确认登录"按钮,如果界面还显示确认登录则继续点击,直到不显示为止retry: 5wait: 8000 # 延长登录等待时间# 弹窗处理- ai: 如果出现"绑定手机"相关弹窗:1. 点击左上角的返回按钮"<"2. 等待1000ms后检查是否仍有弹窗3. 若仍有弹窗,点击"暂不绑定"else:不执行任何操作wait: 3000- ai: 如果出现其他弹窗:1. 优先点击"暂不开启"按钮2. 等待2000ms若出现"仍不开启",点击"仍不开启"按钮3. 等待2000ms若出现其他弹窗有取消文案,点击"取消"按钮else:不执行任何操作wait: 3000# 最终验证- aiAssert: 验证界面底部出现"首页"或"我"文案desc: 登录成功判定依据timeout: 15000 # 大幅延长最终验证超时onError:- ai: 等待3秒后再次检查wait: 3000- aiAssert: 再次验证界面底部出现"首页"或"我"文案timeout: 10000
运行脚本
midscene .\android_script\open_wps_office.yaml --dotenv-override=true --share-browser-context