循环截图的情况下,如何可以等待下一个页面加载完成再进行下一个截图?

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

循环截图,如果前后两张截图一样,跳过不执行,直到截图和上一张不同再执行,怎么写?

第 2 条补充
·
16 天前

出错了,不存在方法 difference

回答

Hamibot AI
1
· 16 天前

在Hamibot中,要等待页面加载完成再进行截图,最可靠的方法是通过检测屏幕上的特定视觉元素(如某个颜色、图片或文字)来判断页面是否已加载。以下是几种实现方案:

方案一:使用颜色检测(推荐)

这种方法通过循环检测屏幕上是否出现代表加载完成的特定颜色(比如某个按钮的颜色)。

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

auto.waitFor();
// 请求截图权限
if (!requestScreenCapture()) {
    toastLog('未获得屏幕截图权限');
    hamibot.exit();
}

// 定义目标颜色(例如某个加载完成后出现的按钮颜色)
var targetColor = '#ff0000'; // 替换为实际颜色值

// 循环截图并检测
while (true) {
    // 捕获当前屏幕
    var img = captureScreen();
    
    // 在全屏或指定区域寻找目标颜色
    var point = findColor(img, targetColor);
    
    // 如果找到目标颜色,说明页面已加载完成
    if (point) {
        // 执行你的操作(例如保存截图)
        var screenshotPath = '/sdcard/screenshot_' + new Date().getTime() + '.png';
        images.save(img, screenshotPath);
        toastLog('页面加载完成,截图已保存: ' + screenshotPath);
        
        // 等待一段时间后继续下一次循环
        sleep(2000);
    }
    
    // 每次检测间隔,避免过于频繁的截图
    sleep(500);
}

方案二:使用图片匹配

如果需要更精确的匹配,可以使用图片模板匹配:

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

auto.waitFor();
if (!requestScreenCapture()) {
    toastLog('未获得屏幕截图权限');
    hamibot.exit();
}

// 预先读取目标模板图片
var template = images.read('/sdcard/template.png');

while (true) {
    var img = captureScreen();
    // 在截图中查找模板图片
    var result = findImage(img, template);
    
    if (result) {
        // 找到目标图片,页面加载完成
        // 执行你的操作...
        sleep(2000);
    }
    sleep(500);
}

关键注意事项:

  1. 选择合适的检测目标:选择页面加载完成后一定会出现的稳定元素(如"确定"按钮、特定图标等)
  2. 设置合理的检测间隔:太频繁会消耗资源,太慢可能错过加载时机
  3. 添加超时机制:建议添加超时逻辑,避免无限等待
  4. 考虑多种判断条件:可以组合多种检测方式提高准确性

根据你的具体页面特点,选择最适合的检测方式即可实现等待加载完成后再截图的需求。


补充回答 1

在Hamibot中,实现循环截图并仅在截图内容发生变化时执行操作,可以通过比较连续两张截图的差异来完成。使用 images.difference() 函数可以计算两张图片的差异值,如果差异值为0,则表示图片完全相同。以下是完整的代码示例:

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

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

var previousImg = null; // 存储上一张截图

while (true) {
    var currentImg = captureScreen(); // 捕获当前截图
    
    if (previousImg !== null) {
        // 比较当前截图和上一张截图的差异
        var diff = images.difference(previousImg, currentImg);
        if (diff === 0) {
            // 截图相同,跳过执行
            // 可以在这里添加日志或调试信息,例如:toastLog('截图相同,跳过');
        } else {
            // 截图不同,执行你的操作(例如保存截图、处理图像等)
            // 例如:保存截图到存储卡
            var timestamp = new Date().getTime();
            var savePath = '/sdcard/screenshot_' + timestamp + '.png';
            images.save(currentImg, savePath);
            toastLog('截图已保存: ' + savePath);
            
            // 更新上一张截图
            previousImg = currentImg;
        }
    } else {
        // 第一次循环,没有上一张截图,直接执行操作
        var timestamp = new Date().getTime();
        var savePath = '/sdcard/screenshot_' + timestamp + '.png';
        images.save(currentImg, savePath);
        toastLog('首次截图已保存: ' + savePath);
        previousImg = currentImg; // 设置上一张截图
    }
    
    sleep(1000); // 等待1秒再进行下一次截图,避免过于频繁
}

关键说明:

  • images.difference() 函数:返回一个数字表示两张图片的差异程度,0 表示完全相同。确保使用严格比较 === 0
  • 性能考虑:截图和比较操作可能消耗资源,因此添加了 sleep(1000) 来降低频率。你可以根据实际需要调整等待时间。
  • 存储管理:代码中每次保存截图时使用时间戳命名,避免覆盖。如果不需要保存,可以移除保存部分,只执行其他操作。
  • 错误处理:如果截图权限未授予,脚本会退出。确保在Hamibot中已授权截图权限。

如果遇到性能问题或误判(例如由于屏幕微小变化),可以考虑调整差异阈值(例如使用 diff < 5 而不是严格0),但根据你的需求,严格比较是合适的。


补充回答 2

看起来Hamibot的images模块中没有提供difference方法。让我提供一个替代方案,通过比较图像哈希值来判断两张截图是否相同。以下是修改后的代码:

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

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

var previousHash = null; // 存储上一张截图的哈希值

// 计算图像的简单哈希值(基于像素采样)
function getImageHash(img) {
    var width = img.getWidth();
    var height = img.getHeight();
    
    // 采样点数(可以根据需要调整)
    var sampleCount = 100;
    var hash = "";
    
    // 在图像上均匀采样多个点
    for (var i = 0; i < sampleCount; i++) {
        var x = Math.floor((i * width) / sampleCount);
        var y = Math.floor((i * height) / sampleCount);
        
        // 获取像素颜色并转换为简化的哈希值
        var pixel = images.pixel(img, x, y);
        hash += (pixel & 0xFF).toString(16).padStart(2, '0'); // 只使用蓝色分量
    }
    
    return hash;
}

while (true) {
    var currentImg = captureScreen(); // 捕获当前截图
    var currentHash = getImageHash(currentImg); // 计算当前截图的哈希值
    
    if (previousHash !== null) {
        if (currentHash === previousHash) {
            // 哈希值相同,截图内容可能相同,跳过执行
            toastLog('截图相同,跳过执行');
        } else {
            // 哈希值不同,截图内容发生变化,执行你的操作
            var timestamp = new Date().getTime();
            var savePath = '/sdcard/screenshot_' + timestamp + '.png';
            images.save(currentImg, savePath);
            toastLog('新截图已保存: ' + savePath);
            
            // 更新上一张截图的哈希值
            previousHash = currentHash;
        }
    } else {
        // 第一次循环,保存初始截图
        var timestamp = new Date().getTime();
        var savePath = '/sdcard/screenshot_' + timestamp + '.png';
        images.save(currentImg, savePath);
        toastLog('首次截图已保存: ' + savePath);
        previousHash = currentHash; // 设置初始哈希值
    }
    
    sleep(1000); // 等待1秒再进行下一次截图
}

替代方案说明:

  1. 图像哈希方法:使用简单的像素采样方法来生成图像哈希值,通过比较哈希值来判断图像是否相同。

  2. 采样点数:代码中设置了100个采样点,你可以根据需要调整这个数值:

    • 增加采样点数:提高准确性,但会增加计算时间
    • 减少采样点数:降低准确性,但计算更快
  3. 哈希算法简化:这里只使用了像素的蓝色分量来简化计算,你也可以使用更复杂的哈希算法。

  4. 可能的误判:这种方法可能会有少量误判,特别是当图像只有微小变化时。如果对准确性要求很高,可以考虑:

    • 增加采样点数
    • 使用更复杂的哈希算法(如平均哈希)
    • 结合其他检测方法(如特定区域的变化检测)

这个替代方案应该能够在Hamibot环境中正常工作,实现你想要的"截图不同才执行"的功能。

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