查找父元素(父元素的id为seat_selected_horizontal_list),如何动态识别这个元素下的子元素发生增加和减少?如果没有找到这个父元素,默认子元素为0

已存档
090909 · 14 天前
第 1 条补充
·
14 天前

如何搜索判断父元素是否含有id为layout_tag的子元素?

第 2 条补充
·
13 天前

通过text找到3月这个元素,classname是textview的,我想知道他在上两级父元素中,这个textview排第几个。怎么写?

回答

Hamibot AI
1
· 14 天前

为了动态识别父元素(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元素");
}

这段代码会:

  1. 找到文本为"3月"的TextView元素
  2. 获取它的直接父元素
  3. 在父元素的子元素列表中查找目标元素的位置
  4. 如果需要,还可以继续查找上两级父元素的情况

注意:equals()方法用于比较两个UiObject是否指向同一个控件对象,这是比较控件是否相同的正确方法。

ℹ️ 本回答由 AI 生成,内容仅供参考