找到目标元素后,想找一个和这个元素并列层级的另一个元素,代码怎么写?

测试脚本 · 1 天前
第 1 条补充
·
1 天前

availableTickets[0] 和 waitTickets[0] 哪个不为空值就赋值给visibleTicket,怎么写?

第 2 条补充
·
15 小时前

第一次找到目标元素后,做了向上划动操作,第二次如何再确认他的坐标位置?

回答

Hamibot AI
1
· 1 天前

// 文档地址 https://docs.hamibot.com/

在Hamibot中,当你已经找到一个目标元素后,可以通过以下两种主要方法找到它的兄弟元素(并列层级元素):

方法一:通过父元素查找

// 假设已找到目标元素
var targetElement = id("target_id").findOnce();

if (targetElement) {
    // 获取父元素
    var parent = targetElement.parent();
    if (parent) {
        // 在父元素下查找具有特定id的兄弟元素
        var siblingElement = parent.findOne(id("sibling_id"));
        if (siblingElement) {
            log("找到兄弟元素");
            // 对兄弟元素进行操作
            siblingElement.click();
        }
    }
}

方法二:通过索引位置查找

// 假设已找到目标元素
var targetElement = id("target_id").findOnce();

if (targetElement) {
    var parent = targetElement.parent();
    if (parent) {
        // 获取目标元素在父容器中的索引位置
        var index = targetElement.indexInParent();
        
        // 找到后一个兄弟元素(如果存在)
        if (index + 1 < parent.childCount()) {
            var nextSibling = parent.child(index + 1);
            log("找到后一个兄弟元素");
            nextSibling.click();
        }
        
        // 找到前一个兄弟元素(如果存在)
        if (index > 0) {
            var prevSibling = parent.child(index - 1);
            log("找到前一个兄弟元素");
            prevSibling.click();
        }
    }
}

实际应用场景示例

假设你在一个列表中找到了某个商品名称元素,想点击同一行的"加入购物车"按钮:

// 找到商品名称元素
var productName = text("商品A").findOnce();

if (productName) {
    var parent = productName.parent();
    if (parent) {
        // 在同一父容器中查找"加入购物车"按钮
        var addToCartBtn = parent.findOne(text("加入购物车"));
        if (addToCartBtn) {
            addToCartBtn.click();
            log("已点击加入购物车按钮");
        }
    }
}

注意:使用这些方法前,请确保目标元素确实存在且具有父元素。你可以先通过log(targetElement)确认元素是否被正确找到。


补充回答 1

// 文档地址 https://docs.hamibot.com/
var visibleTicket = availableTickets[0] != null ? availableTickets[0] : waitTickets[0];

这段代码使用了三元运算符,它会先检查availableTickets[0]是否不为null或undefined(使用!= null可以同时检查这两种情况),如果是有效的值就使用它,否则使用waitTickets[0]。这种写法简洁且兼容Hamibot使用的Rhino 1.7.15引擎。

如果你需要更明确的判断逻辑,也可以这样写:

// 文档地址 https://docs.hamibot.com/
var visibleTicket;
if (availableTickets && availableTickets.length > 0 && availableTickets[0] != null) {
visibleTicket = availableTickets[0];
} else if (waitTickets && waitTickets.length > 0 && waitTickets[0] != null) {
visibleTicket = waitTickets[0];
} else {
visibleTicket = null; // 两个数组的第一个元素都为空时的默认值
}


补充回答 2

在Hamibot中,如果你已经对元素进行了向上划动操作,页面布局可能已经发生了变化,元素的坐标位置也会随之改变。要确认元素的最新坐标位置,你可以按照以下步骤操作:

  1. 首先需要重新查找目标元素(因为滑动后元素位置已变化)
  2. 使用bounds()方法获取元素在屏幕上的最新坐标范围

具体代码示例:

// 文档地址 https://docs.hamibot.com/
// 第一次找到元素并向上滑动
var element = text("目标文本").findOne();
var bounds = element.bounds();
swipe(bounds.centerX(), bounds.centerY() + 200, bounds.centerX(), bounds.centerY() - 200, 500);

// 等待页面滑动完成
sleep(1000);

// 重新查找元素(因为页面已滚动,元素位置改变)
var elementAfterSwipe = text("目标文本").findOne();
var newBounds = elementAfterSwipe.bounds();

// 获取元素最新的坐标位置
toast("元素最新坐标: x=" + newBounds.centerX() + ", y=" + newBounds.centerY());

// 如果需要点击这个位置
click(newBounds.centerX(), newBounds.centerY());

注意:

  • 滑动操作后必须添加适当的sleep()等待,让页面有时间完成滚动动画
  • 每次页面发生变化后,都应该重新查找元素并获取其最新坐标
  • 使用bounds()获取的是一个Rect对象,包含left, top, right, bottom四个属性,centerX()和centerY()是计算出的中心点坐标

如果你使用root权限,可以使用Tap(newBounds.centerX(), newBounds.centerY())代替click()方法。

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