找到目标元素后,想找一个和这个元素并列层级的另一个元素,代码怎么写?
availableTickets[0] 和 waitTickets[0] 哪个不为空值就赋值给visibleTicket,怎么写?
第一次找到目标元素后,做了向上划动操作,第二次如何再确认他的坐标位置?
回答
// 文档地址 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中,如果你已经对元素进行了向上划动操作,页面布局可能已经发生了变化,元素的坐标位置也会随之改变。要确认元素的最新坐标位置,你可以按照以下步骤操作:
- 首先需要重新查找目标元素(因为滑动后元素位置已变化)
- 使用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()方法。