ChromeDriver自动化截图测试:验证DDColor输出结果一致性
在AI图像修复技术快速落地的今天,一个看似简单的“老照片上色”任务背后,其实藏着工程化落地的巨大挑战。我们不再满足于“能出图”,而是越来越关注“每次出的图是否一致”。尤其是在模型微调、环境迁移或参数更新后,如何确保用户看到的色彩还原效果没有发生意外偏移?这正是质量保障的关键所在。
ComfyUI 作为当前最流行的基于节点式工作流的AI图像生成平台,凭借其可视化操作和模块化设计,极大降低了 DDColor 等先进着色算法的使用门槛。然而,这种图形界面友好性也带来了一个新问题:缺乏标准化接口。当你要验证某次更新是否影响了输出质量时,传统做法是手动点几下、看一眼——效率低、主观性强、难以追溯。
有没有可能把这套“打开页面 → 加载模板 → 上传图片 → 点击运行 → 查看结果”的流程完全自动化?答案是肯定的。借助ChromeDriver + Selenium,我们可以将整个交互过程脚本化,并通过截图比对实现像素级一致性检测。这不是简单的UI自动化,而是一套面向AI视觉模型的轻量级回归测试方案。
想象这样一个场景:你正在维护一个用于家庭影像数字化的服务系统,后台集成了 DDColor 的人物与建筑双模式修复能力。某天团队升级了基础模型版本,CI流水线自动触发一轮全量测试。几分钟后,系统报警:一张标准测试人像的肤色区域出现了轻微偏黄。虽然整体仍可接受,但系统已捕捉到这一变化,并附上了前后对比图供人工复核。这就是本文所描述方案的实际价值——让AI模型的行为变得可观测、可度量、可控制。
要实现这一点,核心在于打通三个环节:前端操作自动化 → 图像输出捕获 → 视觉差异量化。
首先来看第一个环节:如何精准操控 ComfyUI 这类复杂Web界面?
浏览器自动化:从人工点击到程序驱动
Selenium 驱动下的 ChromeDriver 是目前工业界最成熟的浏览器自动化工具之一。它不仅能启动本地Chrome实例,还能在无头(headless)模式下静默运行,非常适合集成进CI/CD环境。更重要的是,它支持精确的元素定位、事件模拟和状态等待机制,这对处理异步加载的AI生成界面尤为关键。
以 DDColor 工作流为例,典型的操作链包括:
- 打开
http://localhost:8188 - 点击“工作流”按钮
- 上传预设的 JSON 模板文件(如
DDColor人物黑白修复.json) - 在指定上传区拖入测试图像
- 触发执行并等待结果渲染完成
- 截取输出画布区域
这些步骤看似简单,但在代码中需解决几个关键问题:
- 动态等待而非固定延时
AI推理耗时不稳定,硬编码time.sleep(20)极不可靠。更好的方式是监听输出节点的变化,例如某个图像容器的src属性被更新,或新增了一个带有特定 class 的 result 节点。
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 等待输出图像出现且 src 不为空 output_img = WebDriverWait(driver, 30).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".comfy-output-image img")) ) WebDriverWait(driver, 30).until( lambda d: d.find_element(By.CSS_SELECTOR, ".comfy-output-image img").get_attribute("src").startswith("data:image") )文件上传的实现技巧
ComfyUI 中的上传区域通常是隐藏的<input type="file">元素,直接.send_keys("/path/to/image.jpg")即可触发上传,无需真实拖拽。精准截图避免干扰
直接调用driver.save_screenshot()会包含整个浏览器窗口,包含菜单栏、侧边控件等无关内容。理想做法是先定位到输出画布的 DOM 元素,再进行裁剪。
canvas = driver.find_element(By.CSS_SELECTOR, ".comfy-output-canvas") canvas.screenshot("result_only.png")当然,更进一步的做法是结合 OpenCV 对截图做边缘检测或模板匹配,提取纯结果图像,为后续比对提供干净输入。
接下来是第二个核心环节:DDColor 工作流本身的稳定性控制。
DDColor 并非通用着色器,而是针对不同场景做了专项优化。它的两个主要模式——人物修复与建筑修复——在模型选择、预处理策略和后处理强度上均有差异。比如:
- 人物模式更注重肤色保真,常采用较小分辨率(460–680px),聚焦面部细节;
- 建筑模式则倾向保留大场景结构,推荐使用 960–1280px 分辨率,避免纹理压缩失真。
这些配置都被封装在对应的 JSON 工作流文件中。因此,工作流文件本身就成了“测试用例”的一部分。你可以为每种模式准备独立的标准测试集,并绑定对应的工作流模板,形成“输入+配置→期望输出”的闭环。
此外,ComfyUI 提供了/api/v1/prompt接口,允许通过 HTTP 请求直接提交工作流,绕过前端界面。这种方式更适合大规模批量测试:
import requests import json with open("DDColor人物黑白修复.json", "r") as f: workflow = json.load(f) # 替换占位符图像路径 workflow["nodes"][5]["widgets_values"][0] = "/test/images/test_input.png" response = requests.post( "http://localhost:8188/api/v1/prompt", json={"prompt": workflow} )不过要注意,API 方式跳过了UI反馈,无法直观确认执行状态。对于需要截图留证的质量审计任务,仍建议保留 ChromeDriver 路径。
最后一个环节也是最容易被忽视的:图像比对不是简单的“是否相同”判断。
两张由神经网络生成的图像几乎不可能做到逐像素一致,即使输入和模型完全一样,也可能因浮点计算顺序、GPU调度等因素产生微小差异。因此,不能简单用哈希值对比。
更合理的做法是分层评估:
| 方法 | 适用场景 | 说明 |
|---|---|---|
| Perceptual Hash (pHash) | 快速粗筛 | 计算图像感知哈希,容忍轻微噪点,适合初步过滤明显异常 |
| SSIM(结构相似性) | 主流选择 | 综合亮度、对比度、结构三方面评估,贴近人眼感知 |
| PSNR(峰值信噪比) | 定量分析 | 数值越高越好,但对局部偏差敏感度不足 |
| OpenCV模板匹配 | 局部重点监控 | 可指定关注区域(如人脸区域),检测局部偏色 |
例如,在人物修复测试中,可以先对整图计算 SSIM,若低于阈值(如 0.95),再提取面部区域进行二次比对,从而减少误报。
import cv2 import numpy as np from skimage.metrics import structural_similarity as ssim img1 = cv2.imread("baseline.png") img2 = cv2.imread("current.png") gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) score, _ = ssim(gray1, gray2, full=True) print(f"SSIM Score: {score:.4f}")当 SSIM 持续下降趋势出现时,即便仍在“可接受”范围内,也可能预示着模型退化的苗头,值得深入排查。
整套系统的运行流程可以归纳为:
- 启动 ComfyUI 服务(可通过 Docker 容器隔离环境)
- 运行测试脚本,加载 ChromeDriver
- 导入标准工作流模板
- 上传固定测试图像
- 触发执行并智能等待输出
- 截取结果区域并保存为当前版本快照
- 与基准图进行多维度比对
- 输出报告:通过 / 警告 / 失败
这个流程可嵌入 GitLab CI 或 Jenkins,在每次代码合并前自动执行。配合通知机制(如企业微信/钉钉机器人),第一时间发现潜在退化。
实际部署中还需注意几点工程细节:
- 统一测试素材库:建立包含典型人像、建筑、复杂背景的小型标准集,覆盖常见修复难点;
- 资源隔离:使用 Docker Compose 编排 ComfyUI、ChromeDriver 和测试脚本,避免端口冲突和依赖污染;
- 异常重试机制:网络波动、显存不足等可能导致单次失败,应设置最多两次重试;
- 日志与归档:每次测试生成的日志、截图、比对分数应集中存储,便于长期追踪趋势。
回到最初的问题:为什么我们需要为一个“能自动出图”的AI系统再加一层“自动化测试”?
因为真正的生产力提升,不在于“能不能做”,而在于“做得稳不稳定”。ChromeDriver 在这里扮演的角色,不只是一个点击工具,更是连接实验性AI模型与工业化交付之间的桥梁。它让我们能把那些原本依赖“肉眼验收”的模糊判断,转化为可重复、可量化、可追溯的技术动作。
未来,这条路径还可以走得更远:
- 将历史截图构建成可视化时间轴,观察模型演进轨迹;
- 引入差异热力图,高亮变化最显著区域;
- 结合语义分割,判断“蓝天是否还是蓝的”、“皮肤有没有变灰”;
- 最终构建全自动的 AI 视觉模型 CI/CD 流水线,实现“提交即测、异常即警”。
技术的意义,从来不只是让机器学会画画,更是让我们有能力看清每一次笔触的变化。