为什么我遇到有个脚本一个按钮已经划到屏幕看不见的地方了他还是能点击到,这是用了啥方法

HAMI_7785267079 · 3 小时前
第 1 条补充
·
3 小时前

如果我的目标是点击2026和2024来回切换,我把它滑倒了最上面屏幕看不到了怎么让他来回切换给个代码例子

第 2 条补充
·
3 小时前

那那个数量加号呢,还有那个框里的数量怎么样可以获取到

回答

Hamibot AI
1
· 3 小时前

这是因为脚本使用了基于控件的自动化方式,而不是基于坐标的点击方式。

在Hamibot中,基于控件的自动化(如id().click()、text().click()等)可以直接操作视图层次结构中的元素,即使这些元素当前不在屏幕可视区域内。这是Android无障碍服务的一个特性:只要控件存在于视图层次结构中,无论是否在屏幕可见区域,都可以通过控件ID、文本等属性来定位并操作。

例如:

// 即使按钮已经滑出屏幕外,只要它存在于视图层次结构中
id("submit_button").findOne().click();

与之相对的是基于坐标的点击方式(click(x,y)),这种方式只能点击屏幕当前可见区域内的坐标位置。

需要注意的是:

  1. 这种方式依赖于无障碍服务能访问到完整的视图层次结构
  2. 某些应用可能会对屏幕外的控件进行特殊处理(如禁用或移除)
  3. 对于已经完全滑出屏幕且被系统回收的控件,这种方式可能也会失效

如果你需要确保控件在屏幕上可见后再点击,可以在点击前添加滑动操作,将目标控件滑动到可视区域内。


补充回答 1

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

这种情况通常是因为控件虽然视觉上不可见,但仍在视图层次结构中。你可以直接通过控件属性定位并点击,不需要它在屏幕可见区域内:

// 等待界面加载完成
auto.waitFor();

// 直接通过文本查找年份控件并点击(假设2026是当前显示的年份)
var year2026 = text("2026").findOne(2000);
if (year2026) {
    year2026.click();
    toastLog("已点击2026");
} else {
    toastLog("未找到2026");
}

// 等待切换完成
sleep(1000);

// 查找并点击2024
var year2024 = text("2024").findOne(2000);
if (year2024) {
    year2024.click();
    toastLog("已点击2024");
} else {
    toastLog("未找到2024");
}

如果控件被完全滑出屏幕且被系统回收了,可以添加滑动操作:

auto.waitFor();

// 先向上滑动把控件带入可视区域
swipe(device.width/2, device.height*0.8, device.width/2, device.height*0.2, 500);
sleep(1000);

// 尝试点击2026
var year2026 = text("2026").findOne(2000);
if (year2026) {
    year2026.click();
    toastLog("已点击2026");
} else {
    // 如果还是找不到,尝试通过父容器定位
    var picker = className("android.widget.NumberPicker").findOne(1000);
    if (picker) {
        // 通常年份选择器是NumberPicker的子控件
        var child = picker.children()[1]; // 中间的可见项
        if (child) {
            child.click();
            toastLog("通过NumberPicker点击");
        }
    }
}

注意:

  1. 如果是日期选择器,通常使用className("android.widget.NumberPicker")定位更可靠
  2. 对于某些应用,可能需要多次滑动才能将目标控件带入可视区域
  3. 使用findOne(2000)可以等待最多2秒,确保界面元素加载完成
  4. 如果控件没有文本属性,可以尝试使用desc()(内容描述)或id()来定位

补充回答 2

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

要操作数量加号按钮和获取数量框中的值,可以这样实现:

// 等待界面加载完成
auto.waitFor();

// 查找加号按钮(根据常见情况提供几种定位方式)
var plusButton;

// 尝试1:通过文本查找(如果加号显示为"+")
plusButton = text("+").findOne(1000);
if (!plusButton) {
    // 尝试2:通过内容描述查找(无障碍描述)
    plusButton = descContains("加").findOne(1000) || descContains("increase").findOne(1000);
}
if (!plusButton) {
    // 尝试3:通过ID查找(常见ID如btn_plus, increment等)
    plusButton = id("btn_plus").findOne(1000) || id("increment").findOne(1000);
}
if (!plusButton) {
    // 尝试4:通过类名和位置(在数量框右侧的按钮)
    var numberPicker = className("android.widget.NumberPicker").findOne(1000);
    if (numberPicker) {
        // 通常加号是NumberPicker的最后一个子控件
        var children = numberPicker.children();
        if (children.length > 0) {
            plusButton = children[children.length - 1];
        }
    }
}

// 点击加号按钮
if (plusButton) {
    plusButton.click();
    toastLog("已点击加号按钮");
} else {
    toastLog("未找到加号按钮");
}

// 获取数量框中的数值
var quantityText;
var quantityValue = 0;

// 尝试1:通过常见ID查找数量显示
quantityText = id("number").findOne(1000) || id("quantity").findOne(1000) || id("tv_number").findOne(1000);
if (!quantityText) {
    // 尝试2:通过类名查找(EditText或TextView)
    quantityText = className("android.widget.EditText").findOne(1000) || 
                  className("android.widget.TextView").findOne(1000);
}
if (!quantityText) {
    // 尝试3:通过位置关系(加号旁边的控件)
    if (plusButton) {
        quantityText = plusButton.parent().child(1); // 假设数量框是加号的前一个兄弟节点
    }
}

// 获取并解析数量值
if (quantityText) {
    var textValue = quantityText.text() || quantityText.desc();
    quantityValue = parseInt(textValue) || 0;
    toastLog("当前数量: " + quantityValue);
} else {
    toastLog("未找到数量显示框");
}

补充说明:

  1. 如果是电商类应用的加减数量,通常结构是:数量框(EditText/TextView) + 加号按钮(Button)
  2. 有时数量框可能没有直接文本,需要通过content-desc属性获取:quantityText.desc()
  3. 如果上述方法都不行,可以使用Hamibot的"布局分析"功能,长按目标控件查看其详细属性
  4. 对于某些特殊应用,可能需要先滑动到可见区域:quantityText.scrollIntoView()

如果要实现连续点击加号直到达到特定数量:

var targetQuantity = 5;
while (quantityValue < targetQuantity) {
    if (plusButton) {
        plusButton.click();
        sleep(300); // 等待动画完成
        // 重新获取数量值
        var newValue = quantityText.text() || quantityText.desc();
        quantityValue = parseInt(newValue) || quantityValue + 1;
    } else {
        toastLog("加号按钮不可用");
        break;
    }
}
ℹ️ 本回答由 AI 生成,内容仅供参考