无障碍
在大多数情况下,应用都具有无障碍节点(部分游戏除外),通过无障碍服务可以获取界面上的某个或某些节点,获取后可对其执行指定操作,例如点击、设置文本等。
M8Test 提供了无障碍服务组件,通过无障碍服务权限即可实现自动化操作。我们需要先在 build.gradle.kts
文件中引入该组件:
// 在脚本项目中引用 M8Test 组件
requireComponent {
// 无障碍组件
name = "YumiMiyamotoAccessibility"
// 组件版本,可在 https://github.com/YumiMiyamoto/accessibility-release/releases/ 查看最新版本
version = "0.1.3"
// 组件下载地址
url =
"https://github.com/YumiMiyamoto/accessibility-release/releases/download/Accessibility-$version/com.m8test.accessibility-release_$version.apk"
}
使用无障碍服务时,通常有三种方式(可参考《自动化 》章节):
直接执行手势操作,即在屏幕上模拟点击、滑动等手势
执行全局操作,例如返回、回到主页、显示通知栏等
选择无障碍节点并对其进行操作,例如设置节点文本、点击节点、让节点获取焦点等,通常包含两个步骤:
选择节点:通过无障碍选择器筛选满足条件的节点
执行操作:对选中的节点进行点击、设置文本等操作
下面介绍该组件中的核心类,这些类提供了无障碍服务的核心功能,如获取界面节点、执行操作等。相关类的 API 接口文档可查看: https://yumimiyamoto.github.io/accessibility-release/
AccessibilityService
无障碍服务包装接口,用于提供各类无障碍服务功能,包括执行手势操作、执行全局动作、创建无障碍节点选择器等。这是一个全局变量,可在入口脚本文件或初始化脚本文件中直接使用。
import com.m8test.script.GlobalVariables.*
_console.log(_accessibility!!.swipeDown())
$console.log($accessibility.swipeDown())
import static com.m8test.script.GlobalVariables.*;
$console.log($accessibility.swipeDown());
$console.log($accessibility.swipeDown())
_console:log(_accessibility:swipeDown())
<?php
/** @var m8test_java\com\m8test\script\core\api\console\Console $console */
global $console;
/** @var m8test_java\com\m8test\accessibility\api\Accessibility $accessibility */
global $accessibility;
$result = $accessibility->swipeDown();
$console->log($result);
from m8test_java.com.m8test.script.GlobalVariables import _accessibility
from m8test_java.com.m8test.script.GlobalVariables import _console
_console.log(_accessibility.swipeDown())
$console.log($accessibility.swipeDown)
AccessibilityNode
表示无障碍节点信息的接口,通过该接口不仅可以获取由无障碍服务获取到的节点属性(如节点的文本、ID、位置、是否可点击、是否可聚焦等),还能对节点执行各类操作(如点击、设置文本等)。
import com.m8test.script.GlobalVariables.*
// 获取可编辑元素,一般为输入框
val editableNode = _accessibility!!.createSelector().editable { it }.findOne(0, -1)
// 为可编辑元素设置文本, 在实际开发中还需要判断 editableNode 是否为空
editableNode?.setText("M8Test")
// 获取可编辑元素,一般为输入框
def editableNode = $accessibility.createSelector().editable { it }.findOne(0, -1)
// 为可编辑元素设置文本, 在实际开发中还需要判断 editableNode 是否为空
editableNode.setText("M8Test")
import com.m8test.accessibility.api.AccessibilityNode;
import kotlin.jvm.functions.Function1;
import static com.m8test.script.GlobalVariables.$accessibility;
// 获取可编辑元素,一般为输入框
AccessibilityNode editableNode = $accessibility.createSelector().editable(new Function1() {
@Override
public Object invoke(Object o) {
return o;
}
}).findOne(0, -1);
// 为可编辑元素设置文本, 在实际开发中还需要判断 editableNode 是否为空
editableNode.setText("M8Test");
// 获取可编辑元素,一般为输入框
let editableNode = $accessibility.createSelector().editable(function (isEditable) {
return isEditable;
}).findOne(0, -1)
// 为可编辑元素设置文本, 在实际开发中还需要判断 editableNode 是否为空
editableNode.setText("M8Test")
-- 获取可编辑元素,一般为输入框
local editableNode = _accessibility:createSelector():editable(function(editable)
return editable
end):findOne(0, -1)
-- 为可编辑元素设置文本, 在实际开发中还需要判断 editableNode 是否为空
editableNode:setText("M8Test")
<?php
/** @var m8test_java\com\m8test\accessibility\api\Accessibility $accessibility */
global $accessibility;
// 获取可编辑元素,一般为输入框
$editableNode = $accessibility->createSelector()->editable(function ($editable){return $editable;})->findOne(0, -1);
// 为可编辑元素设置文本, 在实际开发中还需要判断 editableNode 是否为空
$editableNode->setText("M8Test");
from m8test_java.com.m8test.script.GlobalVariables import _accessibility
# 获取可编辑元素,一般为输入框
editableNode = _accessibility.createSelector().editable(lambda editable: editable).findOne(0, -1)
# 为可编辑元素设置文本, 在实际开发中还需要判断 editableNode 是否为空
editableNode.setText("M8Test")
# encoding: utf-8
# 获取可编辑元素,一般为输入框
editableNode = $accessibility.createSelector.editable { |editable| editable }.findOne(0, -1)
# 为可编辑元素设置文本, 在实际开发中还需要判断 editableNode 是否为空
editableNode.setText("M8Test")
AccessibilityNodes
表示无障碍节点集合的接口,当获取到多个节点信息时,可通过该接口获取多个节点信息。
AccessibilitySelector
表示无障碍节点选择器的接口,用于设置无障碍节点的选择条件,只有同时满足所有条件的节点才会被返回。例如可设置节点的文本内容、是否可点击、是否可聚焦等条件;更高级的用法还包括设置兄弟节点、子节点及父节点的选择器,通过这些选择器可实现更复杂的筛选条件。
import com.m8test.script.GlobalVariables.*
// 获取可编辑元素,一般为输入框
val editableNode = _accessibility!!.createSelector().editable { it }.findOne(0, -1)
// 为可编辑元素设置文本, 在实际开发中还需要判断 editableNode 是否为空
editableNode?.setText("M8Test")
// 获取可编辑元素,一般为输入框
def editableNode = $accessibility.createSelector().editable { it }.findOne(0, -1)
// 为可编辑元素设置文本, 在实际开发中还需要判断 editableNode 是否为空
editableNode.setText("M8Test")
import com.m8test.accessibility.api.AccessibilityNode;
import kotlin.jvm.functions.Function1;
import static com.m8test.script.GlobalVariables.$accessibility;
// 获取可编辑元素,一般为输入框
AccessibilityNode editableNode = $accessibility.createSelector().editable(new Function1() {
@Override
public Object invoke(Object o) {
return o;
}
}).findOne(0, -1);
// 为可编辑元素设置文本, 在实际开发中还需要判断 editableNode 是否为空
editableNode.setText("M8Test");
// 获取可编辑元素,一般为输入框
let editableNode = $accessibility.createSelector().editable(function (isEditable) {
return isEditable;
}).findOne(0, -1)
// 为可编辑元素设置文本, 在实际开发中还需要判断 editableNode 是否为空
editableNode.setText("M8Test")
-- 获取可编辑元素,一般为输入框
local editableNode = _accessibility:createSelector():editable(function(editable)
return editable
end):findOne(0, -1)
-- 为可编辑元素设置文本, 在实际开发中还需要判断 editableNode 是否为空
editableNode:setText("M8Test")
<?php
/** @var m8test_java\com\m8test\accessibility\api\Accessibility $accessibility */
global $accessibility;
// 获取可编辑元素,一般为输入框
$editableNode = $accessibility->createSelector()->editable(function ($editable){return $editable;})->findOne(0, -1);
// 为可编辑元素设置文本, 在实际开发中还需要判断 editableNode 是否为空
$editableNode->setText("M8Test");
from m8test_java.com.m8test.script.GlobalVariables import _accessibility
# 获取可编辑元素,一般为输入框
editableNode = _accessibility.createSelector().editable(lambda editable: editable).findOne(0, -1)
# 为可编辑元素设置文本, 在实际开发中还需要判断 editableNode 是否为空
editableNode.setText("M8Test")
# encoding: utf-8
# 获取可编辑元素,一般为输入框
editableNode = $accessibility.createSelector.editable { |editable| editable }.findOne(0, -1)
# 为可编辑元素设置文本, 在实际开发中还需要判断 editableNode 是否为空
editableNode.setText("M8Test")
Last modified: 08 August 2025