查找父元素(父元素的id为seat_selected_horizontal_list),如何动态识别这个元素下的子元素发生增加和减少?如果没有找到这个父元素,默认子元素为0
如何搜索判断父元素是否含有id为layout_tag的子元素?
通过text找到3月这个元素,classname是textview的,我想知道他在上两级父元素中,这个textview排第几个。怎么写?
回答
为了动态识别父元素(id为"seat_selected_horizontal_list")下的子元素数量变化,你可以使用Hamibot的UI自动化功能。以下是一个示例脚本,它会定期检查父元素是否存在,并监控子元素数量的增加或减少。如果父元素不存在,则默认子元素数量为0。
脚本使用轮询方式(每隔一定时间检查一次),并通过日志输出变化情况。代码考虑了兼容性,避免使用箭头函数或默认参数,以适配Rhino 1.7.15引擎。
// 文档地址 https://docs.hamibot.com/
// 初始化变量
var previousCount = 0;
var parentSelector = id('seat_selected_horizontal_list');
// 首先检查父元素是否存在
var parent = parentSelector.findOnce();
if (parent == null) {
log("父元素未找到,子元素数量: 0");
previousCount = 0;
} else {
previousCount = parent.childCount();
log("初始子元素数量: " + previousCount);
}
// 进入监控循环(可根据需要添加退出条件,例如超时或用户中断)
while (true) {
// 重新查找父元素,因为屏幕内容可能变化
var currentParent = parentSelector.findOnce();
var currentCount = 0;
if (currentParent == null) {
currentCount = 0;
} else {
currentCount = currentParent.childCount();
}
// 检查数量是否变化
if (currentCount != previousCount) {
log("子元素数量变化: 从 " + previousCount + " 到 " + currentCount);
previousCount = currentCount; // 更新记录
}
// 等待一段时间后再次检查(例如每秒一次)
sleep(1000);
}
说明:
- 查找父元素:使用
id('seat_selected_horizontal_list').findOnce()来立即查找父元素,不阻塞脚本执行。如果找不到,返回null。 - 获取子元素数量:使用
childCount()方法获取当前子元素数量。 - 动态监控:通过
while循环定期检查子元素数量变化,并使用sleep(1000)控制检查频率(这里设置为1秒)。 - 处理父元素不存在:如果父元素未被找到,子元素数量默认为0。
注意事项:
- 这个脚本会无限循环监控,直到手动停止。你可以根据需要添加退出条件,例如设置最大循环次数或超时时间。
- 如果屏幕变化频繁,调整
sleep时间以避免性能问题。 - 确保在Hamibot环境中运行,并已授予必要的无障碍权限。
如果你需要处理特定子元素的变化(如内容或属性),可以扩展脚本使用 children() 或 find() 方法遍历子元素。
补充回答 1
要判断父元素是否包含ID为"layout_tag"的子元素,可以使用Hamibot的UiSelector和findOne()方法。具体代码如下:
// 首先获取父元素,假设父元素的ID为'parent_id'
var parent = id('parent_id').findOne();
if (parent) {
// 在父元素中查找ID为'layout_tag'的子元素
var child = parent.findOne(id('layout_tag'));
if (child) {
toast('找到子元素');
} else {
toast('未找到子元素');
}
} else {
toast('未找到父元素');
}
这段代码会先查找父元素,然后在父元素范围内搜索指定ID的子元素。如果找到则说明存在,否则不存在。注意根据你的实际情况替换'parent_id'为父元素的实际ID。
补充回答 2
根据你的需求,要找到文本为"3月"的TextView元素,并确定它在父元素中的位置,可以使用以下代码:
// 文档地址 https://docs.hamibot.com/
// 找到文本为"3月"的TextView
var targetView = text("3月").className("TextView").findOne();
if (targetView) {
// 获取父元素
var parent = targetView.parent();
if (parent) {
// 获取父元素的所有子元素
var children = parent.children();
// 查找目标元素在父元素中的位置
var index = -1;
for (var i = 0; i < children.length; i++) {
if (children[i].equals(targetView)) {
index = i;
break;
}
}
if (index !== -1) {
log("目标元素在直接父元素中排第 " + (index + 1) + " 个");
// 如果需要获取上两级父元素
var grandParent = parent.parent();
if (grandParent) {
var grandChildren = grandParent.children();
var parentIndex = -1;
for (var j = 0; j < grandChildren.length; j++) {
if (grandChildren[j].equals(parent)) {
parentIndex = j;
break;
}
}
if (parentIndex !== -1) {
log("直接父元素在上两级父元素中排第 " + (parentIndex + 1) + " 个");
}
}
} else {
log("未找到目标元素在父元素中的位置");
}
} else {
log("目标元素没有父元素");
}
} else {
log("未找到文本为'3月'的TextView元素");
}
如果你需要更精确地查找上两级父元素中这个TextView的位置,可以这样:
// 文档地址 https://docs.hamibot.com/
// 找到文本为"3月"的TextView
var targetView = text("3月").className("TextView").findOne();
if (targetView) {
// 获取上两级父元素
var parent = targetView.parent();
var grandParent = parent ? parent.parent() : null;
if (grandParent) {
// 获取上两级父元素的所有直接子元素
var grandChildren = grandParent.children();
// 查找目标元素在上两级父元素的子元素中的位置
var index = -1;
for (var i = 0; i < grandChildren.length; i++) {
// 检查这个子元素是否包含目标元素
var child = grandChildren[i];
if (child.findOne(text("3月").className("TextView"))) {
index = i;
break;
}
}
if (index !== -1) {
log("目标元素在上两级父元素中排第 " + (index + 1) + " 个");
} else {
log("目标元素不在上两级父元素的直接子元素中");
}
} else {
log("目标元素没有上两级父元素");
}
} else {
log("未找到文本为'3月'的TextView元素");
}
这段代码会:
- 找到文本为"3月"的TextView元素
- 获取它的直接父元素
- 在父元素的子元素列表中查找目标元素的位置
- 如果需要,还可以继续查找上两级父元素的情况
注意:equals()方法用于比较两个UiObject是否指向同一个控件对象,这是比较控件是否相同的正确方法。