M8Test Help

无障碍

在大多数情况下,应用都具有无障碍节点(部分游戏除外),通过无障碍服务可以获取界面上的某个或某些节点,获取后可对其执行指定操作,例如点击、设置文本等。

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" }

使用无障碍服务时,通常有三种方式(可参考《自动化 》章节):

  1. 直接执行手势操作,即在屏幕上模拟点击、滑动等手势

  2. 执行全局操作,例如返回、回到主页、显示通知栏等

  3. 选择无障碍节点并对其进行操作,例如设置节点文本、点击节点、让节点获取焦点等,通常包含两个步骤:

    • 选择节点:通过无障碍选择器筛选满足条件的节点

    • 执行操作:对选中的节点进行点击、设置文本等操作

下面介绍该组件中的核心类,这些类提供了无障碍服务的核心功能,如获取界面节点、执行操作等。相关类的 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