基于Qwen3.5-9B与OpenClaw实现AI驱动的端到端UI自动化测试实践

📅 2026/6/30 18:39:54
基于Qwen3.5-9B与OpenClaw实现AI驱动的端到端UI自动化测试实践
1. 项目概述当大模型“长出”了手和眼最近在折腾一个挺有意思的项目叫 OpenClaw。简单来说它让一个叫 Qwen3.5-9B 的大语言模型不再只是坐在那里跟你聊天而是能真正“动手”操作电脑界面并“看”懂操作结果。这听起来有点像科幻电影里的场景但实现起来核心思路其实很清晰用大模型的“大脑”去理解任务意图再通过一个“执行器”去操控鼠标键盘最后用“眼睛”通常是图像识别或 DOM 解析来验证结果是否达成。这个项目本质上是在探索 AI 驱动的端到端 UI 自动化测试。传统的自动化测试无论是用 Selenium、Playwright 还是 Appium都需要测试工程师编写大量精确的脚本告诉程序“点击这里”、“输入那个”。一旦界面元素稍有改动脚本就可能大面积失效维护成本很高。而 OpenClaw 的思路是我们只告诉 AI “帮我把购物车里的商品结算了”或者“在这个输入框里填上我的用户名”剩下的定位元素、点击、输入、验证等一系列操作都由 AI 来决策和执行。这非常适合谁呢首先是测试开发工程师和追求效率的开发者你可以用它快速验证一个新功能的完整流程或者构建更智能、更健壮的自动化测试用例。其次是对 AI 应用落地方向感兴趣的朋友这是一个将大模型与具体操作系统、应用软件结合起来的绝佳实践案例。最后对于任何被重复性软件操作所困扰的人这或许是一个自动化“数字劳工”的起点。我这次实践的核心是让一个中等规模的模型——Qwen3.5-9B在本地运行起来并成功驱动 OpenClaw 完成了一系列 Web 页面的操作与验证。整个过程涉及模型本地部署、OpenClaw 环境搭建、cc-swich 配置、以及针对模型响应速度的优化。下面我就把踩过的坑和最终跑通的方案毫无保留地分享给你。2. 核心组件选型与部署实战要让 OpenClaw 这套系统跑起来我们需要几个核心部件协同工作一个负责推理的“大脑”大模型一个负责协调的“中枢神经”MCP 服务器以及一个负责执行的“手脚”UI 控制客户端。我的选型基于开源、可控和性价比的考虑。2.1 模型部署本地运行 Qwen3.5-9B 的权衡Qwen3.5-9B 是一个 90 亿参数的中英双语模型在指令跟随和推理能力上表现不错关键是它对硬件的要求相对友好。我选择了Ollama作为本地模型运行框架因为它太方便了一条命令就能拉取和运行模型并且提供了标准的 OpenAI API 兼容接口这让后续的集成变得非常简单。安装与运行 Ollama直接在官网下载对应操作系统的安装包即可。安装完成后在终端执行ollama run qwen2.5:9b第一次运行会自动下载模型。这里我选择的是qwen2.5:9b而非qwen2.5:9b-instruct因为前者是基础模型在 Ollama 的生态下其指令理解能力已经足够且体积稍小。模型默认会使用 GPU 加速如果你有 NVIDIA 显卡并安装了 CUDA。运行后Ollama 会在本地11434端口启动一个服务。关键配置与性能调优默认配置下你可能会感觉模型回复“非常慢”尤其是在复杂的 UI 推理任务中。这是因为 OpenClaw 发出的提示词Prompt往往很长包含了屏幕截图、DOM 树等信息给模型带来了很大的上下文处理压力。解决速度问题的核心在于调整 Ollama 的运行参数。我们需要修改 Ollama 的模型配置文件。首先找到模型的 Modelfile 位置或者直接创建一个。更简单的方法是在运行模型时通过环境变量和参数来控制OLLAMA_NUM_PARALLEL4 OLLAMA_FLASH_ATTENTION1 ollama run qwen2.5:9b --num-predict 512 --temperature 0.1OLLAMA_NUM_PARALLEL4设置并行处理数充分利用多核 CPU。OLLAMA_FLASH_ATTENTION1启用 Flash Attention能显著提升长序列的推理速度需显卡支持。--num-predict 512限制模型最大输出 token 数。对于 UI 操作指令通常不需要很长的文本回复512 足够设置太大会增加不必要的计算和时间。--temperature 0.1降低“温度”使模型的输出更加确定和一致避免在自动化操作中产生随机性行为。经过这样调整后在我的测试环境RTX 4060 Laptop GPU上单个交互的响应时间从 10-20 秒缩短到了 3-8 秒达到了可用的水平。注意如果本地 GPU 显存不足小于 8GB运行 9B 模型可能会非常吃力甚至失败。可以考虑使用量化版本如qwen2.5:7b或qwen2.5:14b的 4-bit 量化版或者在 Ollama 设置中启用num-gpu参数将部分层卸载到 CPU但这会牺牲速度。2.2 OpenClaw 与 MCP 服务器搭建OpenClaw 本身是一个客户端它需要连接一个实现了 Model Context Protocol (MCP) 的服务器。MCP 是 Anthropic 提出的一种协议用于让工具如浏览器控制器、文件系统能够安全、结构化地被大模型调用。部署 OpenClawOpenClaw 提供了多种安装方式。对于桌面使用最方便的是直接下载 Release 版本的客户端。你也可以通过 npm 安装npm install -g openclaw/cli安装后运行openclaw命令即可启动客户端界面。它会引导你进行初始配置最关键的一步就是配置 MCP 服务器。配置 cc-swich 连接本地 OllamaOpenClaw 的配置核心在于cc-swich一个配置切换管理概念实现在其配置文件中。我们需要编辑 OpenClaw 的配置文件通常位于~/.openclaw/config.json或类似路径指定 MCP 服务器和 AI 模型端点。关键配置项如下{ mcpServers: { desktop-agent: { command: npx, args: [-y, modelcontextprotocol/server-desktop-agent, --tool, playwright], env: { OPENAI_API_KEY: sk-not-needed, OPENAI_BASE_URL: http://localhost:11434/v1 } } }, defaultModel: ollama-qwen, models: { ollama-qwen: { apiKey: sk-not-needed, apiBaseURL: http://localhost:11434/v1, model: qwen2.5:9b } } }mcpServers.desktop-agent这里我们使用一个社区实现的桌面代理 MCP 服务器它集成了 Playwright 作为 UI 控制工具。command和args指定了如何启动这个服务器。env为 MCP 服务器设置环境变量。我们将OPENAI_BASE_URL指向本地 Ollama 服务的 OpenAI 兼容端点 (11434端口)。models定义了一个名为ollama-qwen的模型配置同样指向 Ollama并指定使用qwen2.5:9b模型。这个配置完成了链路闭环OpenClaw 客户端 - 调用ollama-qwen模型 - 模型通过 MCP 协议向desktop-agent服务器发出工具调用指令 -desktop-agent使用 Playwright 操作浏览器 - 操作结果截图、DOM通过 MCP 返回给模型 - 模型决定下一步动作。2.3 环境依赖与避坑指南在实际部署中以下几个依赖和细节容易出问题Playwright 浏览器安装desktop-agent依赖 Playwright。首次运行时它可能会自动安装 Playwright 及其所需的浏览器Chromium, Firefox, WebKit。但网络环境可能导致安装失败。建议提前手动安装npm init -y npm install playwright npx playwright install chromium确保系统中已安装必要的库如 Ubuntu 下的libatk-bridge2.0-0,libxkbcommon等。端口冲突与服务启动确保 Ollama (11434) 和 OpenClaw 客户端使用的端口无冲突。启动顺序建议为先启动 Ollama 模型服务再启动 OpenClaw 客户端。权限问题在 Linux/macOS 上UI 自动化需要访问系统的可访问性 API。你可能需要在系统设置中为终端或 OpenClaw 应用开启辅助功能权限。在 Windows 上以管理员身份运行有时能解决某些窗口控制问题。配置文件路径OpenClaw 的配置文件路径因安装方式而异。如果使用全局 npm 安装配置可能在用户目录下如果使用 AppImage 或桌面版则可能在应用数据目录。找不到时可以在启动 OpenClaw 时添加--verbose参数查看日志里面通常会打印配置文件加载路径。3. 自动化测试任务的设计与执行逻辑部署好环境只是第一步如何设计一个能让 AI 可靠执行的测试任务才是体现功力的地方。你不能像指挥传统脚本一样给 AI 下精确到像素的指令而是需要给它“任务目标”和“验证标准”。3.1 任务指令的编写艺术给 OpenClaw 下指令更像是在给一个实习生布置工作你要说清楚做什么和怎么算成功但不用教他具体每一步点哪里。差的指令“点击页面顶部那个蓝色的登录按钮然后在弹出的模态框里第一个输入框输入‘testuser’第二个输入框输入‘password123’最后点击绿色的确认按钮。”好的指令“请帮我登录这个网站。用户名是 ‘testuser’密码是 ‘password123’。登录成功后页面应该会跳转到用户仪表盘或者顶部导航栏会显示我的用户名 ‘testuser’。”区别在于差的指令将实现细节蓝色按钮、第一个输入框与目标绑定一旦 UI 改版按钮变成红色、输入框顺序调整指令立即失效。好的指令只关心业务目标登录和验证条件跳转或显示用户名将如何实现交给 AI 去观察当前页面并决策。在 OpenClaw 中你可以在其聊天界面直接输入这样的自然语言指令。更进阶的用法是将一系列指令编写成一个测试用例文件通过 CLI 或 API 批量执行。3.2 OpenClaw 的执行流程剖析当你发出一个指令后背后发生了一系列精妙的交互观察阶段OpenClaw 通过 MCP 服务器命令 Playwright 对当前活动标签页进行截图并获取页面的简化 DOM 树包含关键元素的标签、ID、类名、文本和位置信息。这些信息被整合成一个结构化的提示词发送给 Qwen3.5-9B 模型。规划与决策阶段Qwen3.5-9B 接收到“视觉”和“结构”信息后结合你的指令进行推理。它会分析“用户想登录。当前页面上有一个表单里面有两个输入框和一个按钮。输入框的 placeholder 分别是‘Username’和‘Password’按钮文字是‘Sign In’。我应该先在第一个输入框输入用户名然后在第二个输入框输入密码最后点击按钮。”执行阶段模型将决策转化为一系列具体的 MCP 工具调用例如mcp_desktop_agent.fill_input填充输入框和mcp_desktop_agent.click_element点击元素。这些调用被发送回 MCP 服务器。执行与再观察MCP 服务器驱动 Playwright 执行点击、输入等操作。操作完成后不会立即进行下一步而是再次触发“观察阶段”获取操作后的新页面状态。验证与循环新的页面状态被送回模型。模型会判断“登录按钮点击后页面发生了变化。出现了‘Welcome, testuser!’的文本。这与用户‘登录成功’的预期相符。任务完成。” 如果未达到预期模型会继续规划下一步操作例如“登录失败出现了错误提示‘Invalid credentials’。我应该清除密码框重新输入正确的密码。”。这个“观察-思考-行动-再观察”的循环是 OpenClaw 实现可靠自动化的核心它模拟了人类操作软件时的试错和调整过程。3.3 针对复杂场景的指令强化对于一些复杂操作单纯的指令可能不够。我们需要在指令中嵌入更明确的约束或上下文。多步骤流程“请完成商品下单流程1. 在搜索框输入‘无线鼠标’并搜索。2. 在结果列表的第一个商品页面点击‘加入购物车’。3. 进入购物车页面点击‘去结算’。4. 在结算页面选择第一个配送地址使用默认支付方式提交订单。最终验证页面是否显示‘订单提交成功’的提示。”条件判断“如果页面弹出‘接受Cookie’的横幅就点击‘同意’按钮。然后继续执行登录操作。”数据驱动你可以结合外部数据。例如将一个 CSV 文件中的用户名密码列表通过脚本循环调用 OpenClaw 的 API实现批量登录测试。指令可以设计为“使用用户名{username}和密码{password}登录系统验证是否成功。”通过这样设计OpenClaw 就从一个简单的单次操作工具升级为了一个能够处理复杂业务流程的自动化测试智能体。4. 结果验证策略与稳定性提升自动化测试执行只是前半部分可靠的结果验证才是价值所在。OpenClaw 的验证能力依赖于大模型的“理解”能力但这需要引导和强化。4.1 验证指令的设计模式验证不能只说“检查是否成功”。要告诉 AI 成功的具体表现是什么。这里有几个经过实践验证的有效模式元素存在性验证“操作完成后请检查页面中是否出现了包含‘订单号’字样的文本元素。” 或者 “确认顶部导航栏是否存在一个显示‘我的账户’的下拉菜单。”页面跳转验证“提交表单后页面的 URL 是否从/login变为了/dashboard” AI 可以通过 MCP 工具获取当前 URL。内容匹配验证“登录后请找到页面中显示用户名的区域确认其中包含的文本是否是‘testuser’。”状态变化验证“点击‘收藏’按钮后请观察该按钮的文本是否从‘收藏’变成了‘已收藏’或者图标颜色是否从灰色变为红色。”在给 AI 的指令中明确地将这些验证条件作为任务目标的一部分。例如“目标成功登录并验证登录后页面右上角显示的用户名包含‘testuser’。”4.2 处理动态内容与等待机制Web 应用充满动态内容这是自动化测试最大的挑战之一。OpenClaw 的“观察-行动”循环本身具备一定的等待能力但我们可以通过指令让它更智能。显式等待指令在关键操作后可以指示 AI 主动等待。“点击提交按钮后请等待 2 秒观察页面是否出现加载动画或进度条等待它们消失后再进行下一步判断。” 虽然 AI 不能直接“sleep”但你可以指示它进行多次观察直到状态稳定。处理异步加载对于点击后通过 AJAX 加载的内容指令可以这样写“点击‘加载更多’按钮然后持续观察列表区域直到有新的商品卡片元素出现为止。”应对弹窗和遮罩指令中需要包含对意外弹窗的处理逻辑。“在执行任何操作过程中如果出现模态框Modal或遮罩层优先关闭它们寻找并点击‘X’按钮或‘取消’按钮再继续原任务。”4.3 提升执行稳定性的技巧即使有了强大的模型和清晰的指令在实际运行中仍可能失败。以下技巧能显著提升成功率简化初始页面状态让 AI 从一个干净、稳定的页面开始操作。例如每次测试前先通过 Playwright 脚本导航到一个固定的登录页 URL清除 localStorage 和 sessionStorage而不是从一个可能残留历史状态的浏览器标签开始。提供元素定位提示谨慎使用虽然不推荐在指令中指定具体元素但对于某些极其重要且容易混淆的元素可以给予提示。“请注意提交按钮可能是一个button元素其>问题现象可能原因排查步骤与解决方案OpenClaw 启动后无响应或报连接错误1. Ollama 服务未启动。2. 配置文件中的 API 地址或端口错误。3. 防火墙/安全软件阻止了连接。1. 终端执行ollama list确认服务运行curl http://localhost:11434/api/generate测试 API 是否可达。2. 仔细检查config.json中的OPENAI_BASE_URL和apiBaseURL确保是http://localhost:11434/v1。3. 临时关闭防火墙或添加规则放行11434端口。模型响应速度极慢30秒1. 提示词过长模型处理慢。2. 未使用 GPU 或 GPU 驱动有问题。3. Ollama 参数未优化。1. 观察 OpenClaw 日志看发送的提示词大小。可尝试在 MCP 服务器端限制截图分辨率和 DOM 信息量。2. 运行ollama ps查看模型是否使用 GPU。运行nvidia-smi(Linux) 或任务管理器 (Windows) 确认 GPU 被调用。3. 按本文 2.1 节调整 Ollama 运行参数特别是--num-predict和temperature。AI 执行点击或输入的位置错误1. 页面动态加载AI 操作时元素未就位。2. 截图/DOM 信息与实际渲染有细微差异。3. 模型对复杂布局理解有偏差。1. 在指令中加入“等待”逻辑或确保操作前页面已完全加载。2. 这是一个固有问题。可尝试提高截图质量或在指令中描述更独特的元素特征如结合图标和文本。3. 考虑换用视觉能力更强的多模态模型如 Qwen-VL但部署成本更高。操作过程中浏览器崩溃或无响应1. Playwright 浏览器实例内存泄漏或冲突。2. 被测页面有无限循环或大量动画。1. 为 OpenClaw/MCP 服务器设置超时和自动重启机制。定期重启整个测试流程。2. 在 Playwright 启动浏览器时添加参数如--disable-gpu或--disable-dev-shm-usage或限制被测页面的资源。无法处理桌面应用或非浏览器控件默认的desktop-agent主要针对 Web。寻找或开发支持其他 UI 框架如 Electron, Qt, Java AWT/Swing的 MCP 服务器。社区有实验性的desktop-agent分支支持更多平台。验证逻辑不准确误判成功/失败1. 验证指令过于模糊。2. 模型对成功状态的理解与预期不符。1. 将验证指令具体化、原子化。例如不要验证“登录成功”而是验证“页面标题变为‘控制台’”且“出现了‘退出登录’按钮”。2. 在指令中提供“反例”说明。例如“如果出现‘密码错误’的红色文字则代表登录失败。”效能优化心得轻量化观察与 MCP 服务器开发者沟通或自行修改减少每次观察时传输的 DOM 数据量只传递关键区域如#main,.content的元素可以大幅降低提示词长度提升推理速度。缓存与复用对于数据不变的静态页面部分可以考虑在客户端缓存截图和 DOM 特征仅将变化区域发送给模型但这需要较深的定制开发。任务脚本化对于高度重复的测试流程可以录制一次成功的 AI 操作序列将其转化为一个可重放的“脚本”本质是一系列 MCP 工具调用的序列下次直接执行脚本而非完全依赖 AI 实时推理这在回归测试中能极大提升效率。这个项目让我深刻体会到当前阶段的 AI 驱动的自动化最适合的场景是探索性测试、复杂业务流程的录制、以及对变化有一定容忍度的日常任务。它还不能完全替代需要毫米级精度和绝对稳定性的传统自动化脚本但它为我们打开了一扇新的大门用人类的语言来指挥机器工作让自动化测试的创建和维护变得更自然、更高效。随着模型能力的进化特别是视觉理解和规划能力的提升这条路会越走越宽。