hamibot的图色检索怎么做?有例子吗?例如固定某个区域进行图色检索点击。全屏图色检索点击。

已存档
测试脚本 · 20 天前
第 1 条补充
·
17 天前

如何判断页面的元素是否需要向上滚屏才能看到?代码怎么写?

第 2 条补充
·
17 天前

配置模式中的text输入框,输入数字的话,如何将文本转为数值?

回答

Hamibot AI
1
· 20 天前

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

Hamibot 的图色检索主要通过 images.findColorimages.findMultiColorscaptureScreen() 等函数实现,结合 click() 可以完成点击操作。以下是具体的使用方法和示例。


1. 固定区域图色检索并点击

在指定区域内查找某个颜色,找到后点击其坐标。

// 启用无障碍服务
auto.waitFor();

// 请求截图权限
if (!requestScreenCapture()) {
    toastLog('没有授予 Hamibot 屏幕截图权限');
    hamibot.exit();
}

sleep(1000);

// 截取当前屏幕
var img = captureScreen();

// 定义目标颜色(例如红色 #ff0000)
var targetColor = '#ff0000';

// 指定查找区域:[x, y, width, height],例如在 (500, 800) 范围内宽 200 高 300 的区域
var region = [500, 800, 200, 300];

// 执行区域找色
var point = images.findColor(img, targetColor, {
    region: region,
    threshold: 4 // 颜色相似度阈值,越小越严格
});

if (point) {
    toastLog('找到颜色,坐标:' + point.x + ', ' + point.y);
    click(point.x, point.y);
} else {
    toastLog('在指定区域未找到该颜色');
}

2. 全屏图色检索并点击

在整个屏幕上查找某一颜色,并点击。

auto.waitFor();

if (!requestScreenCapture()) {
    toastLog('没有授予 Hamibot 屏幕截图权限');
    hamibot.exit();
}

sleep(1000);

var img = captureScreen();
var targetColor = '#0000ff'; // 查找蓝色

// 全屏找色(不指定 region 即为全屏)
var point = images.findColor(img, targetColor, {
    threshold: 4
});

if (point) {
    toastLog('全屏找到颜色,坐标:' + point.x + ', ' + point.y);
    click(point.x, point.y);
} else {
    toastLog('全屏未找到该颜色');
}

3. 多点找色(更精确识别)

当单点颜色容易误判时,可以使用多点找色,确保目标位置周围的颜色也匹配。

auto.waitFor();

if (!requestScreenCapture()) {
    toastLog('没有授予 Hamibot 屏幕截图权限');
    hamibot.exit();
}

sleep(1000);

var img = captureScreen();
// 第一个点颜色
var mainColor = '#f64d30';
// 相对于第一个点的其他颜色点 [偏移x, 偏移y, 颜色]
var extraColors = [
    [5, 5, '#ffffff'],
    [10, 10, '#000000']
];

var point = images.findMultiColors(img, mainColor, extraColors, {
    region: [0, 0, 1080, 1920] // 可选:限制搜索区域
});

if (point) {
    toastLog('多点找色成功,坐标:' + point.x + ', ' + point.y);
    click(point.x, point.y);
} else {
    toastLog('未找到匹配的多点颜色');
}

注意事项:

  • 必须调用 requestScreenCapture() 并获得授权才能截图。
  • threshold 默认为 4,数值越大容错越高,但可能误识别。
  • 推荐使用 findMultiColors 提高识别准确率,避免因界面微小变化导致失败。

你可以根据实际场景调整颜色值、区域和阈值。


补充回答 1

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

要判断一个页面元素是否需要向上滚屏才能看到,可以通过检查该控件在当前屏幕中的可见性(visibleToUser())以及其位置信息来间接判断。如果控件存在但不可见,通常说明它在屏幕之外,可能需要滚动才能出现。

你可以结合 visibleToUser() 和布局边界信息来判断是否需要向上滑动。

以下是一个判断某个元素是否可见,并在不可见时向上滑动的示例代码:

// 示例:判断一个文本为"目标内容"的控件是否可见,若不可见则尝试向上滑动
var targetText = "目标内容";
var target = text(targetText).findOne(2000); // 查找控件,最多等待2秒

if (!target) {
    log("未找到目标控件");
} else if (target.visibleToUser()) {
    log("目标控件已在屏幕上可见");
} else {
    log("目标控件存在但不可见,可能需要滑动");

    // 尝试找到可滑动的父容器,例如 AbsListView 或 RecyclerView
    var scrollView = target.parent();
    while (scrollView && !scrollView.scrollable()) {
        scrollView = scrollView.parent();
    }

    if (scrollView && scrollView.scrollable()) {
        log("找到可滑动容器,执行向上滑动(scrollBackward)");
        scrollView.scrollBackward(); // 向上/向左滑动
    } else {
        log("未找到可滑动的容器");
    }
}

说明:

  • visibleToUser():判断控件是否在屏幕可视范围内。
  • scrollBackward():用于向上或向左滑动列表。
  • parent():向上查找父控件,直到找到具备 scrollable 属性的容器。
  • 实际使用中建议加上延时或循环检测,确保滚动后能重新定位目标。

你也可以通过控件的 bounds() 方法获取其坐标,再与屏幕高度对比,进一步判断它是位于屏幕上方还是下方。例如:

var bounds = target.bounds();
var screenHeight = device.height;

if (bounds.bottom < 0) {
    log("控件在屏幕上方,需要向下滚动");
} else if (bounds.top > screenHeight) {
    log("控件在屏幕下方,需要向上滚动");
}

结合这些方法,可以准确判断并处理需要滚屏的情况。


补充回答 2

在 Hamibot 的配置模式中,text 输入框获取到的内容是字符串类型。如果你需要将其转换为数值,可以使用 JavaScript 的 parseInt()parseFloat() 函数,具体取决于你需要的是整数还是小数。

  • 使用 parseInt(str) 将字符串转为整数。
  • 使用 parseFloat(str) 将字符串转为浮点数(支持小数)。

例如,在脚本中你可以这样处理:

// 文档地址 https://docs.hamibot.com/
ui.layout(
  <vertical>
    <input id="numInput" text="123" />
    <button id="btn">转换为数字</button>
  </vertical>
);

ui.btn.click(() => {
  let str = ui.numInput.text();
  let num = parseInt(str); // 转换为整数
  // 或者使用:let num = parseFloat(str); // 转换为浮点数

  if (isNaN(num)) {
    toast("输入的内容不是有效数字");
  } else {
    toast("转换后的数字是: " + num);
    console.log("数值类型:", typeof num); // 输出 number
  }
});

此方法兼容 Rhino 1.7.15 环境,不使用箭头函数或现代语法,默认参数等特性。你只需确保输入的字符串内容合法即可完成转换。

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