在安卓系统中,虚拟屏幕支持无障碍服务的使用,但这一功能需在安卓 11 及以上版本中实现。其操作方式十分简便:只需先创建或获取虚拟屏幕,再将该虚拟屏幕的 ID 作为参数,传递给无障碍服务相关类的对应方法即可。
import com.m8test.script.GlobalVariables.*
import com.m8test.script.core.api.display.Display
// 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个
fun getDisplay(): Display {
return _displays.getAll().firstOrNull() ?: _displays.create {
// 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置
}
}
// 获取一个虚拟屏幕
val display = getDisplay()
// 节点(小红书视频界面右边的工具栏)父节点的选择器
val parentSelector = _accessibility!!.createSelector()
// 节点(小红书视频界面右边的工具栏)父节点的类名是`android.widget.LinearLayout`
.className { it == "android.widget.FrameLayout" }
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的选择器
val child00Selector = _accessibility!!.createSelector()
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的类名为 "android.widget.TextView"
.className { it == "android.widget.TextView" }
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为1的子节点的选择器
val child01Selector = _accessibility!!.createSelector()
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为1的子节点的类名为 "android.widget.ImageView"
.className { it == "android.widget.ImageView" }
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的选择器
val child0Selector = _accessibility!!.createSelector()
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的类名为 `android.widget.Button`
.className { it == "android.widget.Button" }
// 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
.child(0, child00Selector)
// 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
.child(1, child01Selector)
// 定义一个选择器用于选择小红书视频界面右边工具栏,包含了`点赞`、`收藏`、`分享`等信息
val selector = _accessibility!!.createSelector()
// 节点(小红书视频界面右边的工具栏)的类名是`android.widget.LinearLayout`
.className { it == "android.widget.LinearLayout" }
// 通过 parent 方法设置父节点的选择器
.parent(parentSelector)
// 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
.child(0, child0Selector)
// 通过选择的 findOne 方法查找节点,如果没有找到则返回 null, 第一个参数为虚拟屏幕 id, android 11(api 30) 以下的手机会忽略该参数, 0 表示主屏幕(物理屏幕镜像),第二个参数为超时时间,单位为毫秒, 如果为负数, 查找一次直接返回, 无论有没有节点满足条件, 如果为0, 则表示一直查找知道找到满足条件的节点, 如果为大于0的数值, 那么就会在该时间内返回, 无论有没有节点满足条件。
val node = selector.findOne(display.getId(), -1)
// 获取点赞,评论以及收藏数量, 可以直接通过层次结构获取节点
if (node != null) {
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的为点赞数量
_console.log("点赞", node.child(0)?.child(0)?.text())
// 节点(小红书视频界面右边的工具栏)索引为1的子节点的索引为1的子节点的为评论数量
_console.log("评论", node.child(1)?.child(1)?.text())
// 节点(小红书视频界面右边的工具栏)索引为2的子节点的索引为1的子节点的为收藏数量
_console.log("收藏", node.child(2)?.child(1)?.text())
}
import com.m8test.script.core.api.display.Display
// 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个
Display getDisplay() {
def allDisplays = $displays.getAll()
if (allDisplays.size() > 0) return allDisplays.get(0)
// 创建虚拟屏幕, create 方法会返回一个 Display 对象
def display = $displays.create {
// 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置
}
return display
}
// 获取一个虚拟屏幕
def display = getDisplay()
// 节点(小红书视频界面右边的工具栏)父节点的选择器
def parentSelector = $accessibility.createSelector()
// 节点(小红书视频界面右边的工具栏)父节点的类名是`android.widget.LinearLayout`
.className { it == "android.widget.FrameLayout" }
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的选择器
def child00Selector = $accessibility.createSelector()
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的类名为 "android.widget.TextView"
.className { it == "android.widget.TextView" }
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为1的子节点的选择器
def child01Selector = $accessibility.createSelector()
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为1的子节点的类名为 "android.widget.ImageView"
.className { it == "android.widget.ImageView" }
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的选择器
def child0Selector = $accessibility.createSelector()
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的类名为 `android.widget.Button`
.className { it == "android.widget.Button" }
// 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
.child(0, child00Selector)
// 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
.child(1, child01Selector)
// 定义一个选择器用于选择小红书视频界面右边工具栏,包含了`点赞`、`收藏`、`分享`等信息
def selector = $accessibility.createSelector()
// 节点(小红书视频界面右边的工具栏)的类名是`android.widget.LinearLayout`
.className { it == "android.widget.LinearLayout" }
// 通过 parent 方法设置父节点的选择器
.parent(parentSelector)
// 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
.child(0, child0Selector)
// 通过选择的 findOne 方法查找节点,如果没有找到则返回 null, 第一个参数为虚拟屏幕 id, android 11(api 30) 以下的手机会忽略该参数, 0 表示主屏幕(物理屏幕镜像),第二个参数为超时时间,单位为毫秒, 如果为负数, 查找一次直接返回, 无论有没有节点满足条件, 如果为0, 则表示一直查找知道找到满足条件的节点, 如果为大于0的数值, 那么就会在该时间内返回, 无论有没有节点满足条件。
def node = selector.findOne(display.getId(), -1)
// 获取点赞,评论以及收藏数量, 可以直接通过层次结构获取节点
if (node != null) {
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的为点赞数量
$console.log("点赞", node.child(0).child(0).text())
// 节点(小红书视频界面右边的工具栏)索引为1的子节点的索引为1的子节点的为评论数量
$console.log("评论", node.child(1).child(1).text())
// 节点(小红书视频界面右边的工具栏)索引为2的子节点的索引为1的子节点的为收藏数量
$console.log("收藏", node.child(2).child(1).text())
}
import com.m8test.accessibility.api.AccessibilityNode;
import com.m8test.accessibility.api.AccessibilitySelector;
import com.m8test.script.core.api.display.Display;
import kotlin.jvm.functions.Function1;
import java.util.List;
import static com.m8test.script.GlobalVariables.*;
private static Display getDisplay() {
List<Display> allDisplays = $displays.getAll();
if (allDisplays.size() > 0) return (Display) allDisplays.get(0);
// 创建虚拟屏幕, create 方法会返回一个 Display 对象
return $displays.create(new Function1() {
@Override
public Object invoke(Object o) {
// 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置
return null;
}
});
}
// 获取一个虚拟屏幕
Display display = getDisplay();
// 节点(小红书视频界面右边的工具栏)父节点的选择器
AccessibilitySelector parentSelector = $accessibility.createSelector()
// 节点(小红书视频界面右边的工具栏)父节点的类名是`android.widget.LinearLayout`
.className(new Function1() {
@Override
public Object invoke(Object o) {
if (o instanceof String) {
return "android.widget.FrameLayout".equals(o);
}
return false;
}
});
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的选择器
AccessibilitySelector child00Selector = $accessibility.createSelector()
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的类名为 "android.widget.TextView"
.className(new Function1() {
@Override
public Object invoke(Object o) {
if (o instanceof String) {
return "android.widget.TextView".equals(o);
}
return false;
}
});
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为1的子节点的选择器
AccessibilitySelector child01Selector = $accessibility.createSelector()
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为1的子节点的类名为 "android.widget.ImageView"
.className(new Function1() {
@Override
public Object invoke(Object o) {
if (o instanceof String) {
return "android.widget.ImageView".equals(o);
}
return false;
}
});
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的选择器
AccessibilitySelector child0Selector = $accessibility.createSelector()
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的类名为 `android.widget.Button`
.className(new Function1() {
@Override
public Object invoke(Object o) {
if (o instanceof String) {
return "android.widget.Button".equals(o);
}
return false;
}
})
// 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
.child(0, child00Selector)
// 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
.child(1, child01Selector);
// 定义一个选择器用于选择小红书视频界面右边工具栏,包含了`点赞`、`收藏`、`分享`等信息
AccessibilitySelector selector = $accessibility.createSelector()
// 节点(小红书视频界面右边的工具栏)的类名是`android.widget.LinearLayout`
.className(new Function1() {
@Override
public Object invoke(Object o) {
if (o instanceof String) {
return "android.widget.LinearLayout".equals(o);
}
return false;
}
})
// 通过 parent 方法设置父节点的选择器
.parent(parentSelector)
// 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
.child(0, child0Selector);
// 通过选择的 findOne 方法查找节点,如果没有找到则返回 null, 第一个参数为虚拟屏幕 id, android 11(api 30) 以下的手机会忽略该参数, 0 表示主屏幕(物理屏幕镜像),第二个参数为超时时间,单位为毫秒, 如果为负数, 查找一次直接返回, 无论有没有节点满足条件, 如果为0, 则表示一直查找知道找到满足条件的节点, 如果为大于0的数值, 那么就会在该时间内返回, 无论有没有节点满足条件。
AccessibilityNode node = selector.findOne(display.getId(), -1);
// 获取点赞,评论以及收藏数量, 可以直接通过层次结构获取节点
if (node != null) {
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的为点赞数量
$console.log("点赞", node.child(0).child(0).text());
// 节点(小红书视频界面右边的工具栏)索引为1的子节点的索引为1的子节点的为评论数量
$console.log("评论", node.child(1).child(1).text());
// 节点(小红书视频界面右边的工具栏)索引为2的子节点的索引为1的子节点的为收藏数量
$console.log("收藏", node.child(2).child(1).text());
}
/**
* 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个
*
* @returns {Packages.com.m8test.script.core.api.display.Display}
*/
function getDisplay() {
let allDisplays = $displays.getAll()
if (allDisplays.size() > 0) return allDisplays.get(0)
// 创建虚拟屏幕, create 方法会返回一个 Display 对象
return $displays.create(function (config) {
// 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置
})
}
// 获取一个虚拟屏幕
let display = getDisplay()
// 节点(小红书视频界面右边的工具栏)父节点的选择器
let parentSelector = $accessibility.createSelector()
// 节点(小红书视频界面右边的工具栏)父节点的类名是`android.widget.LinearLayout`
.className(function (it) {
return it === "android.widget.FrameLayout"
})
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的选择器
let child00Selector = $accessibility.createSelector()
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的类名为 "android.widget.TextView"
.className(function (it) {
return it === "android.widget.TextView"
})
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为1的子节点的选择器
let child01Selector = $accessibility.createSelector()
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为1的子节点的类名为 "android.widget.ImageView"
.className(function (it) {
return it === "android.widget.ImageView"
})
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的选择器
let child0Selector = $accessibility.createSelector()
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的类名为 `android.widget.Button`
.className(function (it) {
return it === "android.widget.Button"
})
// 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
.child(0, child00Selector)
// 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
.child(1, child01Selector)
// 定义一个选择器用于选择小红书视频界面右边工具栏,包含了`点赞`、`收藏`、`分享`等信息
let selector = $accessibility.createSelector()
// 节点(小红书视频界面右边的工具栏)的类名是`android.widget.LinearLayout`
.className(function (it) {
return it === "android.widget.LinearLayout"
})
// 通过 parent 方法设置父节点的选择器
.parent(parentSelector)
// 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
.child(0, child0Selector)
// 通过选择的 findOne 方法查找节点,如果没有找到则返回 null, 第一个参数为虚拟屏幕 id, android 11(api 30) 以下的手机会忽略该参数, 0 表示主屏幕(物理屏幕镜像),第二个参数为超时时间,单位为毫秒, 如果为负数, 查找一次直接返回, 无论有没有节点满足条件, 如果为0, 则表示一直查找知道找到满足条件的节点, 如果为大于0的数值, 那么就会在该时间内返回, 无论有没有节点满足条件。
let node = selector.findOne(display.getId(), -1)
// 获取点赞,评论以及收藏数量, 可以直接通过层次结构获取节点
if (node != null) {
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的为点赞数量
$console.log("点赞", node.child(0).child(0).text())
// 节点(小红书视频界面右边的工具栏)索引为1的子节点的索引为1的子节点的为评论数量
$console.log("评论", node.child(1).child(1).text())
// 节点(小红书视频界面右边的工具栏)索引为2的子节点的索引为1的子节点的为收藏数量
$console.log("收藏", node.child(2).child(1).text())
}
-- 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个
--- @return m8test_java.com.m8test.script.core.api.display.Display
function getDisplay()
local allDisplays = _displays:getAll()
if not allDisplays:isEmpty() then
return allDisplays:get(0)
else
return _displays:create(function(config)
-- 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置
end)
end
end
-- 获取一个虚拟屏幕
local display = getDisplay()
-- 节点(小红书视频界面右边的工具栏)父节点的选择器
local parentSelector = _accessibility:createSelector()
-- 节点(小红书视频界面右边的工具栏)父节点的类名是`android.widget.LinearLayout`
:className(function(it) return it == "android.widget.FrameLayout" end)
-- 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的选择器
local child00Selector = _accessibility:createSelector()
-- 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的类名为 "android.widget.TextView"
:className(function(it) return it == "android.widget.TextView" end)
-- 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为1的子节点的选择器
local child01Selector = _accessibility:createSelector()
-- 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为1的子节点的类名为 "android.widget.ImageView"
:className(function(it) return it == "android.widget.ImageView" end)
-- 节点(小红书视频界面右边的工具栏)索引为0的子节点的选择器
local child0Selector = _accessibility:createSelector()
-- 节点(小红书视频界面右边的工具栏)索引为0的子节点的类名为 `android.widget.Button`
:className(function(it) return it == "android.widget.Button" end)
-- 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
:child(0, child00Selector)
-- 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
:child(1, child01Selector)
-- 定义一个选择器用于选择小红书视频界面右边工具栏,包含了`点赞`、`收藏`、`分享`等信息
local selector = _accessibility:createSelector()
-- 节点(小红书视频界面右边的工具栏)的类名是`android.widget.LinearLayout`
:className(function(it) return it == "android.widget.LinearLayout" end)
-- 通过 parent 方法设置父节点的选择器
:parent(parentSelector)
-- 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
:child(0, child0Selector)
-- 通过选择的 findOne 方法查找节点,如果没有找到则返回 null, 第一个参数为虚拟屏幕 id, android 11(api 30) 以下的手机会忽略该参数, 0 表示主屏幕(物理屏幕镜像),第二个参数为超时时间,单位为毫秒, 如果为负数, 查找一次直接返回, 无论有没有节点满足条件, 如果为0, 则表示一直查找知道找到满足条件的节点, 如果为大于0的数值, 那么就会在该时间内返回, 无论有没有节点满足条件。
local node = selector:findOne(display:getId(), -1)
-- 获取点赞,评论以及收藏数量, 可以直接通过层次结构获取节点
if node ~= nil then
-- 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的为点赞数量
_console:log("点赞", node:child(0):child(0):text())
-- 节点(小红书视频界面右边的工具栏)索引为1的子节点的索引为1的子节点的为评论数量
_console:log("评论", node:child(1):child(1):text())
-- 节点(小红书视频界面右边的工具栏)索引为2的子节点的索引为1的子节点的为收藏数量
_console:log("收藏", node:child(2):child(1):text())
end
<?php
/** @var m8test_java\com\m8test\script\core\api\display\Displays $displays */
global $displays;
/**
* 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个
* @param \m8test_java\com\m8test\script\core\api\display\Displays $displays
* @return \m8test_java\com\m8test\script\core\api\display\Display
*/
function getDisplay($displays)
{
$allDisplays = $displays->getAll();
if ($allDisplays->size() > 0) {
return $allDisplays->get(0);
} else {
return $displays->create(function ($config) {
// 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置
});
}
}
// 获取一个虚拟屏幕
$display = getDisplay($displays);
/** @var m8test_java\com\m8test\accessibility\api\Accessibility $accessibility */
global $accessibility;
/** @var m8test_java\com\m8test\script\core\api\console\Console $console */
global $console;
// 节点(小红书视频界面右边的工具栏)父节点的选择器
$parentSelector = $accessibility->createSelector()
// 节点(小红书视频界面右边的工具栏)父节点的类名是`android.widget.LinearLayout`
->className(function ($it) {
return $it == "android.widget.FrameLayout";
});
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的选择器
$child00Selector = $accessibility->createSelector()
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的类名为 "android.widget.TextView"
->className(function ($it) {
return $it == "android.widget.TextView";
});
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为1的子节点的选择器
$child01Selector = $accessibility->createSelector()
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为1的子节点的类名为 "android.widget.ImageView"
->className(function ($it) {
return $it == "android.widget.ImageView";
});
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的选择器
$child0Selector = $accessibility->createSelector()
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的类名为 `android.widget.Button`
->className(function ($it) {
return $it == "android.widget.Button";
})
// 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
->child(0, $child00Selector)
// 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
->child(1, $child01Selector);
// 定义一个选择器用于选择小红书视频界面右边工具栏,包含了`点赞`、`收藏`、`分享`等信息
$selector = $accessibility->createSelector()
// 节点(小红书视频界面右边的工具栏)的类名是`android.widget.LinearLayout`
->className(function ($it) {
return $it == "android.widget.LinearLayout";
})
// 通过 parent 方法设置父节点的选择器
->parent($parentSelector)
// 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
->child(0, $child0Selector);
// 通过选择的 findOne 方法查找节点,如果没有找到则返回 null, 第一个参数为虚拟屏幕 id, android 11(api 30) 以下的手机会忽略该参数, 0 表示主屏幕(物理屏幕镜像),第二个参数为超时时间,单位为毫秒, 如果为负数, 查找一次直接返回, 无论有没有节点满足条件, 如果为0, 则表示一直查找知道找到满足条件的节点, 如果为大于0的数值, 那么就会在该时间内返回, 无论有没有节点满足条件。
$node = $selector->findOne($display->getId(), -1);
// 获取点赞,评论以及收藏数量, 可以直接通过层次结构获取节点
if ($node != null) {
// 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的为点赞数量
$console->log(javaString("点赞"), $node->child(0)->child(0)->text());
// 节点(小红书视频界面右边的工具栏)索引为1的子节点的索引为1的子节点的为评论数量
$console->log(javaString("评论"), $node->child(1)->child(1)->text());
// 节点(小红书视频界面右边的工具栏)索引为2的子节点的索引为1的子节点的为收藏数量
$console->log(javaString("收藏"), $node->child(2)->child(1)->text());
}
from m8test_java.com.m8test.script.GlobalVariables import _accessibility
from m8test_java.com.m8test.script.GlobalVariables import _console
from m8test_java.com.m8test.script.GlobalVariables import _displays
# 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个
def getDisplay():
allDisplays = _displays.getAll()
if allDisplays.size() > 0:
return allDisplays.get(0)
else:
return _displays.create(lambda config:
# 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置
config)
# 获取一个虚拟屏幕
display = getDisplay()
# 节点(小红书视频界面右边的工具栏)父节点的选择器
parentSelector = (_accessibility.createSelector()
# 节点(小红书视频界面右边的工具栏)父节点的类名是`android.widget.LinearLayout`
.className(lambda it: it == "android.widget.FrameLayout"))
# 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的选择器
child00Selector = (_accessibility.createSelector()
# 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的类名为 "android.widget.TextView"
.className(lambda it: it == "android.widget.TextView"))
# 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为1的子节点的选择器
child01Selector = (_accessibility.createSelector()
# 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为1的子节点的类名为 "android.widget.ImageView"
.className(lambda it: it == "android.widget.ImageView"))
# 节点(小红书视频界面右边的工具栏)索引为0的子节点的选择器
child0Selector = (_accessibility.createSelector()
# 节点(小红书视频界面右边的工具栏)索引为0的子节点的类名为 `android.widget.Button`
.className(lambda it: it == "android.widget.Button")
# 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
.child(0, child00Selector)
# 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
.child(1, child01Selector))
# 定义一个选择器用于选择小红书视频界面右边工具栏,包含了`点赞`、`收藏`、`分享`等信息
selector = (_accessibility.createSelector()
# 节点(小红书视频界面右边的工具栏)的类名是`android.widget.LinearLayout`
.className(lambda it: it == "android.widget.LinearLayout")
# 通过 parent 方法设置父节点的选择器
.parent(parentSelector)
# 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
.child(0, child0Selector))
# 通过选择的 findOne 方法查找节点,如果没有找到则返回 null, 第一个参数为虚拟屏幕 id, android 11(api 30) 以下的手机会忽略该参数, 0 表示主屏幕(物理屏幕镜像),第二个参数为超时时间,单位为毫秒, 如果为负数, 查找一次直接返回, 无论有没有节点满足条件, 如果为0, 则表示一直查找知道找到满足条件的节点, 如果为大于0的数值, 那么就会在该时间内返回, 无论有没有节点满足条件。
node = selector.findOne(display.getId(), -1)
# 获取点赞,评论以及收藏数量, 可以直接通过层次结构获取节点
if (node is not None):
# 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的为点赞数量
_console.log("点赞", node.child(0).child(0).text())
# 节点(小红书视频界面右边的工具栏)索引为1的子节点的索引为1的子节点的为评论数量
_console.log("评论", node.child(1).child(1).text())
# 节点(小红书视频界面右边的工具栏)索引为2的子节点的索引为1的子节点的为收藏数量
_console.log("收藏", node.child(2).child(1).text())
# encoding: utf-8
java_import 'com.m8test.script.core.api.display.Display'
# encoding: utf-8
# 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个
# @return [Display] 已存在或者新创建的虚拟屏幕
def getDisplay
allDisplays = $displays.getAll
if allDisplays.size > 0
allDisplays.get(0)
else
$displays.create { |config|
# 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置
}
end
end
# 获取一个虚拟屏幕
display = getDisplay()
# 节点(小红书视频界面右边的工具栏)父节点的选择器
parentSelector = $accessibility.createSelector.
# 节点(小红书视频界面右边的工具栏)父节点的类名是`android.widget.LinearLayout`
className { |className| className == "android.widget.FrameLayout" }
# 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的选择器
child00Selector = $accessibility.createSelector.
# 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的类名为 "android.widget.TextView"
className { |className| className == "android.widget.TextView" }
# 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为1的子节点的选择器
child01Selector = $accessibility.createSelector.
# 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为1的子节点的类名为 "android.widget.ImageView"
className { |className| className == "android.widget.ImageView" }
# 节点(小红书视频界面右边的工具栏)索引为0的子节点的选择器
child0Selector = $accessibility.createSelector.
# 节点(小红书视频界面右边的工具栏)索引为0的子节点的类名为 `android.widget.Button`
className { |className| className == "android.widget.Button" }.
# 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
child(0, child00Selector).
# 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
child(1, child01Selector)
# 定义一个选择器用于选择小红书视频界面右边工具栏,包含了`点赞`、`收藏`、`分享`等信息
selector = $accessibility.createSelector.
# 节点(小红书视频界面右边的工具栏)的类名是`android.widget.LinearLayout`
className { |className| className == "android.widget.LinearLayout" }.
# 通过 parent 方法设置父节点的选择器
parent(parentSelector).
# 通过 child 方法设置子节点的选择器, 第一个参数为索引,第二个参数为选择器
child(0, child0Selector)
# 通过选择的 findOne 方法查找节点,如果没有找到则返回 null, 第一个参数为虚拟屏幕 id, android 11(api 30) 以下的手机会忽略该参数, 0 表示主屏幕(物理屏幕镜像),第二个参数为超时时间,单位为毫秒, 如果为负数, 查找一次直接返回, 无论有没有节点满足条件, 如果为0, 则表示一直查找知道找到满足条件的节点, 如果为大于0的数值, 那么就会在该时间内返回, 无论有没有节点满足条件。
node = selector.findOne(display.getId(), -1)
# 获取点赞,评论以及收藏数量, 可以直接通过层次结构获取节点
if node
# 节点(小红书视频界面右边的工具栏)索引为0的子节点的索引为0的子节点的为点赞数量
$console.log("点赞", node.child(0).child(0).text)
# 节点(小红书视频界面右边的工具栏)索引为1的子节点的索引为1的子节点的为评论数量
$console.log("评论", node.child(1).child(1).text)
# 节点(小红书视频界面右边的工具栏)索引为2的子节点的索引为1的子节点的为收藏数量
$console.log("收藏", node.child(2).child(1).text)
end