1. 项目概述:当图标遇上智能体

最近在捣鼓一些自动化工作流和智能助手应用时,我一直在想,有没有一种方法能把那些零散的、需要手动点击的图标操作,也变成可以由代码驱动的智能体(Agent)?比如,自动整理桌面图标、根据文件类型批量更改应用图标、甚至模拟一些简单的图形界面点击操作。这听起来像是RPA(机器人流程自动化)的领域,但传统的RPA工具往往笨重且封闭。直到我遇到了 dtannen/icon-agents 这个项目,它提供了一个非常有趣的思路:将图标(Icon)作为智能体感知和交互的媒介与锚点。

简单来说, icon-agents 不是一个给你换图标的工具,而是一个 概念验证和框架 。它探索的是如何让一个AI智能体去“理解”和“操作”图形用户界面(GUI)中的图标元素。你可以把它想象成给AI智能体装上了一双“眼睛”,让它能“看到”屏幕上的按钮、文件夹、应用图标,并且通过程序化的方式去“点击”它们,从而完成一系列任务。这对于自动化测试、无障碍辅助、或者构建能够与任意图形界面交互的通用型智能体来说,是一个基础且关键的能力。

这个项目适合对AI智能体、计算机视觉、自动化脚本感兴趣的开发者、测试工程师,或者任何想深入理解“程序如何与图形界面对话”这一命题的人。它可能不会直接给你一个开箱即用的生产力工具,但它提供的思路、代码范例和架构设计,能帮你打开一扇新的大门。

2. 核心思路与技术架构拆解

icon-agents 项目的核心,在于搭建一个从“视觉感知”到“动作执行”的闭环。它不是一个单一的脚本,而是一个微型的系统架构。理解这个架构,是后续一切实操和扩展的基础。

2.1 感知层:图标检测与识别

智能体要操作图标,第一步是“看见”并“认出”图标。这涉及到计算机视觉(CV)技术。

2.1.1 屏幕捕捉与区域定位 项目通常不会处理整个屏幕的连续视频流,那样数据量太大且低效。更常见的做法是:

  1. 屏幕截图 :使用如 PIL.ImageGrab (Python)、 pyautogui mss 等库,捕获当前屏幕或指定区域的图像。
  2. 目标区域限定 :为了提高效率,可以指定智能体只关注屏幕的某个区域,例如任务栏、桌面、或某个特定的应用程序窗口。这需要结合操作系统API来获取窗口句柄和位置信息。在Windows上可以用 pygetwindow win32gui ,在macOS上可以用 AppKit ,Linux则常用 Xlib ewmh

2.1.2 图标特征提取与匹配 这是最核心的环节。如何从截图中找到“图标”?

  • 传统图像匹配方法 :对于已知的、固定的图标(比如你提前保存了Chrome浏览器的图标图片),可以使用模板匹配(OpenCV的 cv2.matchTemplate )或特征点匹配(SIFT, ORB)。这种方法简单直接,但对于图标尺寸变化、轻微颜色差异或视觉主题切换可能不够鲁棒。
  • 基于深度学习的对象检测 :这是更先进和通用的方法。使用训练好的目标检测模型(如YOLO、SSD),直接检测出图像中所有“可能为图标”的边界框。 icon-agents 如果追求通用性,很可能会倾向于此方案。但这需要收集和标注大量的图标数据来训练模型,或者使用在通用物体检测数据集上预训练的模型进行微调。
  • 结合上下文信息 :单纯的视觉匹配可能把一些类似的按钮也误认为图标。高级的实现会结合图标的上下文,比如它通常出现在桌面的网格位置、任务栏的序列中,或者具有标准的尺寸比例(如64x64, 48x48)。

icon-agents 的上下文中,我推测它可能采用了 混合策略 :对于已知的、关键的图标(如“开始菜单”、“文件资源管理器”)使用预存模板进行快速精确匹配;对于未知图标,则可能尝试提取其颜色直方图、形状轮廓(通过OpenCV的findContours)等特征,与一个动态更新的图标库进行相似度比对。

2.2 决策层:从图标到动作的映射

识别出图标后,智能体需要决定“做什么”。这涉及到简单的规则引擎或更复杂的决策逻辑。

2.2.1 动作定义 每个被识别的图标都可以关联一个或多个动作:

  • 左键单击 :最常用的操作,用于打开应用、选择项目。
  • 右键单击 :打开上下文菜单。
  • 双击 :通常用于打开文件或应用。
  • 拖放 :用于移动图标或文件。
  • 悬停 :用于触发工具提示或菜单预览。

2.2.2 决策逻辑 决策可以非常简单,也可以是任务链的一部分。

  • 直接映射 :识别到“Chrome图标” -> 执行“双击”动作。这可以通过一个预定义的 {图标特征: 动作} 字典来实现。
  • 基于任务的序列 :智能体可能有一个高级目标,如“打开浏览器并访问特定网站”。这个目标会被分解为:1) 定位浏览器图标,2) 双击打开,3) 定位地址栏图标/区域,4) 点击并输入网址...。 icon-agents 框架需要支持这种动作序列的编排。
  • 状态判断 :在执行动作前,可能需要判断图标状态。例如,判断一个任务栏图标是“已启动”(高亮)还是“未启动”(灰色),从而决定是单击(切换窗口)还是双击(启动应用)。这可能需要对比图标在“活跃”与“非活跃”状态下的颜色或像素差异。

2.3 执行层:模拟用户输入

决策完成后,就需要通过程序模拟真实的鼠标和键盘操作。这一层技术相对成熟。

  • 鼠标控制 :使用如 pyautogui pynput 或操作系统原生API ( win32api , Quartz ),将鼠标光标移动到图标边界框的中心坐标,然后执行点击、拖拽等操作。
  • 键盘输入 :配合鼠标操作,例如在打开的运行窗口(Win+R)中输入命令,或在地址栏输入网址。
  • 操作延迟与容错 :这是实操中的关键。必须在操作间加入合理的延迟( time.sleep ),因为GUI的响应需要时间。同时,要有重试机制,比如点击后如果预期窗口没有出现,等待几秒后再次尝试识别或点击。

2.4 框架设计:可扩展性与配置化

一个好的 icon-agents 框架不应是硬编码的。它应该允许用户:

  • 自定义图标库 :用户可以添加自己需要识别的图标图片及其元数据(名称、关联动作、预期位置等)。
  • 编写任务脚本 :用YAML、JSON或简单的DSL(领域特定语言)来描述任务流程,例如:
    tasks:
      - name: "打开编辑器并创建文件"
        steps:
          - detect: "vscode_icon.png"
            action: "double_click"
            wait: 2
          - detect: "explorer_sidebar.png" # 假设识别资源管理器侧边栏图标
            action: "click"
            wait: 1
          - type: "new_file.txt{ENTER}"
    
  • 插件化架构 :感知模块(支持不同CV算法)、执行模块(支持不同操作系统)、决策模块(支持不同AI模型)都可以设计成插件,方便替换和升级。

3. 核心模块实现与实操要点

理解了架构,我们来深入看看各个核心模块如何具体实现,以及其中有哪些容易踩坑的细节。

3.1 高鲁棒性的图标检测模块实现

单纯用 cv2.matchTemplate 找图,在真实场景中非常脆弱。我们需要构建一个更健壮的检测流程。

3.1.1 多尺度与多模板匹配 图标大小可能变化。我们需要对模板图像进行金字塔缩放,在不同尺度上进行匹配。

import cv2
import numpy as np

def multi_scale_template_match(screen_gray, template_gray, threshold=0.8, scales=[0.8, 0.9, 1.0, 1.1, 1.2]):
    found = None
    for scale in scales:
        resized_template = cv2.resize(template_gray, None, fx=scale, fy=scale, interpolation=cv2.INTER_CUBIC)
        # 如果模板比屏幕还大,跳过这个尺度
        if resized_template.shape[0] > screen_gray.shape[0] or resized_template.shape[1] > screen_gray.shape[1]:
            continue
        result = cv2.matchTemplate(screen_gray, resized_template, cv2.TM_CCOEFF_NORMED)
        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
        if found is None or max_val > found[0]:
            found = (max_val, max_loc, scale, resized_template.shape)
    if found and found[0] >= threshold:
        match_val, top_left, used_scale, (tH, tW) = found
        bottom_right = (top_left[0] + tW, top_left[1] + tH)
        return top_left, bottom_right, match_val
    return None

注意 cv2.TM_CCOEFF_NORMED 方法对光照变化有一定鲁棒性,但并非万能。对于彩色图标,可以尝试在HSV颜色空间的V通道(明度)进行匹配,有时效果更好。

3.1.2 引入特征点匹配应对局部遮挡 如果图标被其他窗口轻微遮挡,模板匹配会失效。这时可以使用ORB或SIFT特征点匹配。

def feature_match(screen_img, template_img, min_match_count=10):
    orb = cv2.ORB_create()
    kp1, des1 = orb.detectAndCompute(template_img, None)
    kp2, des2 = orb.detectAndCompute(screen_img, None)
    if des1 is None or des2 is None:
        return None
    bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
    matches = bf.match(des1, des2)
    matches = sorted(matches, key=lambda x: x.distance)
    if len(matches) > min_match_count:
        # 计算单应性矩阵,可以找到图标在屏幕中的透视变换位置(如果图标有旋转或透视)
        src_pts = np.float32([kp1[m.queryIdx].pt for m in matches]).reshape(-1,1,2)
        dst_pts = np.float32([kp2[m.trainIdx].pt for m in matches]).reshape(-1,1,2)
        M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
        if M is not None:
            h, w = template_img.shape[:2]
            pts = np.float32([[0,0],[0,h-1],[w-1,h-1],[w-1,0]]).reshape(-1,1,2)
            dst = cv2.perspectiveTransform(pts, M)
            # 返回一个包围所有变换点的矩形
            x, y, w, h = cv2.boundingRect(dst)
            return (x, y, w, h)
    return None

实操心得 :特征点匹配计算量远大于模板匹配,不适合全屏实时检测。通常的策略是先用模板匹配快速定位大致区域,如果失败或置信度低,再在该区域小范围内使用特征点匹配进行精确定位或验证。

3.1.3 利用颜色和形状信息过滤误检 匹配到的区域可能不是图标,而是一个颜色、形状相似的按钮。可以增加后处理过滤器:

  • 颜色一致性 :检查匹配区域的色彩分布是否与图标模板相似(计算颜色直方图相关性)。
  • 形状/轮廓 :对匹配区域进行二值化和轮廓查找。图标的轮廓通常比较规整(近似矩形、圆形),且面积在一定范围内。如果找到的轮廓奇形怪状或面积过大过小,可以过滤掉。
  • 位置先验 :如果你知道图标只可能在桌面网格上,那么计算出的图标中心坐标应当近似落在虚拟的网格点上,偏离太远的可能是误检。

3.2 动作执行与系统交互的可靠性保障

模拟点击听起来简单,但要让它在各种环境下稳定工作,需要注意很多细节。

3.2.1 精确坐标计算与点击 永远不要相信一次匹配得到的坐标就是最终点击点。图标可能抖动,窗口可能轻微移动。

import pyautogui
import random

def safe_click(center_x, center_y, button='left', clicks=1, interval=0.1, variance=2):
    """
    在目标点附近加入微小随机偏移,模拟人类操作,避免被某些应用检测为机器人。
    variance参数控制随机偏移的像素范围。
    """
    offset_x = random.randint(-variance, variance)
    offset_y = random.randint(-variance, variance)
    target_x = center_x + offset_x
    target_y = center_y + offset_y
    
    # 先移动鼠标,可以加入平滑移动效果(pyautogui.moveTo本身有duration参数)
    pyautogui.moveTo(target_x, target_y, duration=random.uniform(0.1, 0.3))
    pyautogui.click(x=target_x, y=target_y, button=button, clicks=clicks, interval=interval)

重要提示 pyautogui 的坐标是基于整个屏幕的。如果你的截图是某个窗口区域,需要将匹配到的 相对坐标 加上窗口 左上角的屏幕绝对坐标 ,才能得到正确的点击位置。获取窗口位置本身又是一个需要处理跨平台兼容性的问题。

3.2.2 操作间等待与状态验证 这是自动化脚本稳定性的生命线。不要使用固定的 time.sleep

  • 智能等待 :在关键操作后(如点击启动应用),等待直到某个“成功条件”出现。例如,等待预期窗口的标题出现,或者等待屏幕上某个特定元素(如应用主界面上的一个标志性按钮)被检测到。
    import time
    def wait_until_detected(template_img, timeout=10, interval=0.5):
        start_time = time.time()
        while time.time() - start_time < timeout:
            screen = pyautogui.screenshot()
            result = multi_scale_template_match(np.array(screen), template_img)
            if result:
                return result  # 返回检测到的位置信息
            time.sleep(interval)
        raise TimeoutError(f"未检测到目标图标,等待超时({timeout}s)")
    
  • 超时与重试 :任何一个步骤都应设置超时。超时后,可以选择重试该步骤(例如,再次点击),或者记录错误并执行备用方案(如记录日志、发送通知),甚至优雅地停止整个任务链。

3.2.3 权限与焦点问题

  • 管理员权限 :在某些系统或应用中,模拟输入可能需要提升的权限。在Windows上,可能需要以管理员身份运行脚本。
  • 窗口焦点 :你点击一个图标,期望它的窗口弹出并成为焦点。但有时其他窗口可能会抢走焦点。在执行关键键盘输入前,最好先用 pyautogui.click() 再点击一下目标窗口的标题栏或客户区,确保焦点正确。
  • 防屏保/锁屏 :长时间运行的自动化脚本可能遇到系统进入睡眠或锁屏。需要调整系统电源设置,或在脚本中加入周期性的微小鼠标移动( pyautogui.moveRel(0, 1) )来防止此类中断。

3.3 任务编排与错误处理框架

一个健壮的 icon-agents 系统需要一套定义任务和处理异常的逻辑。

3.3.1 定义任务流程 我们可以用一个Python类来封装一个任务步骤。

class TaskStep:
    def __init__(self, name, detector, action, args=None, wait_for=None, retries=3, timeout=5):
        self.name = name
        self.detector = detector  # 检测函数或配置
        self.action = action      # 执行函数,如 'click', 'double_click', 'type'
        self.args = args or {}    # 动作参数
        self.wait_for = wait_for  # 执行后需要等待检测的目标(用于验证)
        self.retries = retries
        self.timeout = timeout
    
    def execute(self, context):
        # context 可以传递屏幕截图、全局状态等
        for attempt in range(self.retries):
            try:
                print(f"执行步骤 [{self.name}], 尝试 {attempt+1}/{self.retries}")
                # 1. 检测目标
                target_pos = self.detector.detect(context['screen'])
                if not target_pos:
                    raise DetectionFailed(f"未检测到目标")
                # 2. 执行动作
                action_executor = ActionLibrary.get(self.action)
                action_executor(target_pos, **self.args)
                # 3. 等待验证(如果有)
                if self.wait_for:
                    result = wait_until_detected(self.wait_for, timeout=self.timeout)
                    context['last_detected'] = result
                print(f"步骤 [{self.name}] 成功")
                return True
            except (DetectionFailed, ActionFailed, TimeoutError) as e:
                print(f"步骤 [{self.name}] 尝试 {attempt+1} 失败: {e}")
                if attempt == self.retries - 1:
                    print(f"步骤 [{self.name}] 重试次数用尽,任务终止。")
                    raise TaskExecutionFailed from e
                time.sleep(1)  # 重试前等待
        return False

3.3.2 全局错误处理与状态恢复 任务链中某一步失败,不应导致脚本崩溃或系统处于未知状态。

  • 状态快照 :在关键步骤执行前,可以保存当前屏幕截图、打开的窗口列表等信息。如果失败,可以尝试分析快照,或者提供一个“回退”到某个安全状态(例如,关闭所有由本任务打开的窗口)的机制。
  • 异常分类 :定义清晰的异常类型,如 DetectionFailed , ActionFailed , TimeoutError , UnexpectedStateError 。针对不同类型的异常,采取不同的恢复策略(重试、跳过、执行清理、上报人工)。
  • 日志记录 :详细记录每个步骤的开始、成功、失败信息,包括时间戳、检测到的坐标、置信度、截图等。这对于后期调试和优化至关重要。可以使用Python的 logging 模块,并配置将日志输出到文件和控制台。

4. 进阶应用场景与扩展思路

基础框架搭建好后, icon-agents 的潜力远不止于简单的桌面图标点击。它可以作为更复杂智能体的“手眼”系统。

4.1 场景一:自动化软件安装与配置

这是一个非常实用的场景。许多软件安装过程需要用户点击“下一步”、“我同意”、“选择安装路径”等。我们可以为每个安装包制作一个“图标/按钮检测库”和对应的任务脚本。

  1. 启动安装程序(双击 setup.exe 图标)。
  2. 检测“下一步”按钮(通常是一个固定的文本或图片),点击。
  3. 检测“我接受协议”复选框,点击。
  4. 检测“浏览”按钮,点击后,使用键盘输入安装路径。
  5. ... 依次进行,直到检测到“完成”按钮。 挑战在于 :不同软件的安装界面千差万别,按钮位置、样式、甚至语言都不同。这需要建立一个强大的、可扩展的界面元素检测模型,或者为每个软件单独配置一套检测规则。

4.2 场景二:图形化界面的自动化测试(GUI Testing)

传统的UI自动化测试工具(如Selenium对于Web,Appium对于移动端)依赖于可访问性树(Accessibility Tree)。但对于一些古老的桌面应用、游戏、或自定义绘制的界面,可能没有可访问性信息。 icon-agents 的视觉方法可以作为补充。

  • 回归测试 :在应用版本更新后,自动执行一系列关键操作流程,通过截图对比或检测关键结果图标,来判断核心功能是否正常。
  • 探索性测试 :让智能体随机或按照某种策略点击界面,尝试发现崩溃、无响应等异常情况。
  • 兼容性测试 :在不同的系统分辨率、DPI缩放比例下,运行相同的测试脚本,验证界面布局是否正常。

4.3 场景三:与LLM(大语言模型)结合,构建“所见即所得”的通用智能体

这是最具想象力的方向。 icon-agents 可以作为LLM的“执行器”。

  1. 用户用自然语言下达指令 :“帮我把桌面上的所有图片文件移动到‘图片’文件夹里。”
  2. LLM理解指令并规划步骤 :LLM将指令分解为:a) 识别桌面,b) 找到所有图片文件图标,c) 识别“图片”文件夹图标,d) 执行拖放操作。
  3. LLM调用 icon-agents 的感知模块 :获取当前屏幕的视觉描述,例如“屏幕左下角有开始菜单,桌面中央有5个图标,其中3个是图片预览...”。
  4. LLM决策并生成动作序列 :基于视觉描述,LLM决定先点击“桌面”视图,然后框选某些图标,最后拖到目标文件夹。
  5. icon-agents 执行模块落实动作 :将LLM生成的高层动作(“框选”、“拖放”)转化为具体的鼠标移动、点击、拖拽的坐标序列并执行。 在这个架构中, icon-agents 负责解决“如何看到”和“如何操作”的问题,而LLM负责解决“做什么”和“为什么这么做”的高层规划与推理问题。这需要定义一套清晰的API和动作原语(Primitives)供LLM调用。

4.4 扩展思路:提升感知能力的更多可能

  • 集成OCR(光学字符识别) :使用 pytesseract easyocr 等库,识别图标旁边的文字标签。这对于区分功能相似但文字不同的按钮(如“确定” vs “取消”,“保存” vs “另存为”)至关重要。可以将视觉特征与OCR识别结果融合,提高识别准确率。
  • 使用目标检测模型 :放弃传统的图像匹配,直接训练一个YOLO模型来检测“可点击的按钮/图标”。这需要大量的标注数据,但一旦训练好,泛化能力会强很多,能识别出从未见过的、但符合“按钮”视觉特征的UI元素。
  • 探索可访问性API :在可能的情况下,优先使用操作系统提供的可访问性API(如Windows的UI Automation, macOS的Accessibility API)来获取UI元素信息。这些API能提供精确的元素类型、位置、状态和层次结构,比纯视觉方案更稳定、更高效。 icon-agents 可以设计为“视觉为主,可访问性API为辅”的混合模式。

5. 常见问题、调试技巧与避坑指南

在实际开发和运行 icon-agents 类项目时,你会遇到各种各样的问题。下面是我从实践中总结的一些典型问题和解决方法。

5.1 图标检测不稳定,时灵时不灵

这是最常见的问题。

  • 可能原因1:屏幕缩放与DPI问题 。在高DPI屏幕上,截图的分辨率和实际坐标可能不匹配。
    • 排查 :打印出截图的分辨率和 pyautogui.size() 返回的屏幕分辨率进行对比。
    • 解决 :在截图和计算坐标时,需要考虑系统的DPI缩放因子。 pyautogui 的坐标是物理像素,但某些截图方法可能返回的是逻辑像素。可以使用 ctypes 库在Windows上获取真实的DPI缩放比例,并对坐标进行换算。
  • 可能原因2:图标视觉变化 。图标可能因主题、选中状态、通知角标等产生变化。
    • 排查 :保存匹配失败时的屏幕截图,与你的模板图标进行人工对比。
    • 解决 :为同一个图标准备多个模板(正常状态、高亮状态、带角标状态)。采用多模板匹配,只要有一个匹配成功即可。或者使用对颜色和亮度变化不敏感的匹配方法(如前面提到的在灰度图或边缘图上匹配)。
  • 可能原因3:背景干扰 。桌面背景复杂,或者有半透明窗口覆盖。
    • 解决 :提高匹配阈值,并加强后处理过滤(如形状、颜色一致性检查)。尝试先检测并屏蔽掉已知的、大面积的干扰区域(如当前活动窗口)。

5.2 模拟点击无效或点错位置

  • 可能原因1:坐标转换错误 。这是新手最容易犯的错误。你匹配到的坐标是相对于截图左上角的,但 pyautogui.click() 需要的是屏幕绝对坐标。
    • 黄金法则 屏幕绝对坐标 = 窗口左上角屏幕坐标 + 元素在窗口内的相对坐标 。务必确保你准确获取了目标窗口的位置( win32gui.GetWindowRect pygetwindow.getWindowGeometry )。
  • 可能原因2:焦点丢失 。你点击了图标,但另一个窗口突然弹出,抢走了焦点,导致后续键盘输入送到了错误的窗口。
    • 解决 :在关键输入前,加入一个显式的焦点获取步骤。例如,先点击目标窗口的标题栏或某个固定区域。或者使用 pyautogui.getActiveWindow() 来检查当前焦点窗口是否为目标窗口。
  • 可能原因3:操作速度过快 。GUI应用和操作系统需要时间响应。连续快速点击可能导致事件被吞掉。
    • 解决 :在每次点击、拖拽、键盘事件之间加入合理的、随机的延迟( time.sleep(random.uniform(0.2, 0.5)) )。使用 pyautogui.PAUSE 全局设置一个基础间隔。

5.3 任务脚本在别人电脑上无法运行

  • 可能原因1:路径和依赖问题 。脚本中使用了绝对路径,或者依赖特定版本的环境。
    • 解决 :使用相对路径,并通过 os.path.join 来构建路径。使用 requirements.txt 明确列出Python依赖。考虑将图标模板等资源文件打包,或提供清晰的配置说明。
  • 可能原因2:系统环境差异 。分辨率、主题、语言、默认字体大小不同。
    • 解决 :让你的检测算法更具鲁棒性(如前所述的多尺度、特征匹配)。或者,提供配置项让用户校准。例如,提供一个“校准模式”,让用户手动点击某个参考点,脚本据此计算坐标转换参数。
  • 可能原因3:安全软件拦截 。某些杀毒软件或系统设置会将自动化脚本的模拟输入行为标记为可疑。
    • 解决 :这是一个棘手的问题。只能提示用户将脚本加入白名单,或者尝试以管理员身份运行(但这本身也可能触发警告)。在商业应用中,可能需要对脚本进行签名。

5.4 调试与日志记录最佳实践

当脚本行为不符合预期时,系统的调试信息是救命稻草。

  1. 可视化调试 :在检测到图标时,在屏幕上画一个醒目的矩形框。这能让你直观地看到脚本“认为”的图标在哪里。
    def debug_show_match(screen_img, top_left, bottom_right, window_title="Debug"):
        # 在图像上画矩形
        cv2.rectangle(screen_img, top_left, bottom_right, (0, 255, 0), 2)
        # 显示图像(开发时用,正式运行时应关闭)
        cv2.imshow(window_title, screen_img)
        cv2.waitKey(500) # 显示500毫秒
        cv2.destroyAllWindows()
    
  2. 分级日志 :使用 logging 模块,设置 DEBUG , INFO , WARNING , ERROR 等级别。在开发时开启DEBUG,记录每一个匹配的置信度、坐标、执行的动作细节。上线后关闭DEBUG,只记录INFO和ERROR。
  3. 失败时保存现场 :当某个步骤重试多次仍失败时,自动保存当前的屏幕截图、日志上下文和错误信息到一个带时间戳的文件中。这对于复现和修复线上问题至关重要。
  4. 单元测试与模拟 :为你的检测器、动作执行器编写单元测试。使用预先保存的屏幕截图作为测试用例,验证检测逻辑是否正确。对于动作执行,可以创建一个“模拟模式”,在此模式下不实际移动鼠标和键盘,只打印出将要执行的操作,用于验证任务逻辑。

icon-agents 这个项目概念,将我们带入了GUI自动化这个既古老又前沿的领域。说它古老,是因为自动化测试工具已存在多年;说它前沿,是因为结合现代CV和AI技术,我们有机会构建出更智能、更通用、更像“人”的交互智能体。实现它的过程,是对计算机视觉、操作系统交互、软件工程和异常处理的一次综合锻炼。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐