一、技能整体概述

Playwright MCP AI 基于 Playwright 浏览器自动化框架结合 MCP 通信协议打造,是集成于 OpenClaw 的全平台智能浏览器操控引擎。原生能力仅基础页面点击、跳转、表单填充,本次围绕二次开发、智能化增强、场景化封装、智能决策、故障自愈、多任务协同完成全面改造,融合 AI 视觉识别、语义理解、动作自主编排、页面智能解析、反爬模拟、批量任务、无人值守运行等能力。

支持 Chrome/Firefox/Safari/Edge 多浏览器、无头 / 有头双模式,适配网页爬虫、表单自动提交、流程化操作、数据采集、页面测试、定时巡检、多账号会话管理等场景,同时深度对接 OpenClaw 生态,实现自然语言驱动自动化、跨技能联动、任务可视化与全流程日志审计。

二、原生版本现存短板 & 二次开发改造切入点

(一)原生核心问题

  1. 指令碎片化:仅支持单步原子操作(点击、输入、跳转),复杂业务流程需要手动编写大量代码,无流程封装能力。
  2. 无智能识别:依赖固定选择器(XPath/CSS),页面元素改版、布局变动后直接失效,鲁棒性极差。
  3. 缺乏自主决策:遇到弹窗、验证码、加载延迟、404 / 跳转页面时无法自主处理,流程直接中断。
  4. 交互生硬:纯机械操作,鼠标轨迹、点击间隔、输入节奏固定,极易被网站风控、反爬系统识别。
  5. 任务能力薄弱:不支持批量任务、多标签并行、多账号会话隔离、定时轮询任务。
  6. 数据处理单一:仅能获取源码 / 截图,无页面内容解析、结构化提取、AI 归纳能力。
  7. 运维成本高:报错信息简陋,无故障定位、自动重试、断点续跑,长流程任务失败需从头执行。
  8. 框架联动弱:操作结果、采集数据无法无缝对接 OpenClaw 其他技能,难以搭建端到端自动化链路。

(二)本次二次开发 & 智能化改造核心方向

  • 新增 AI 视觉 + 语义双识别,摆脱固定选择器依赖;
  • 封装场景化流程模板,低代码 / 自然语言即可调用复杂自动化;
  • 开发智能风控模拟模块,真人行为仿真,绕过基础反爬;
  • 搭建故障自愈引擎,异常自动处理、重试、断点续跑;
  • 增加页面 AI 解析,自动提取文本、表格、链接、关键数据并结构化;
  • 完善多任务调度、会话隔离、定时任务能力;
  • 优化日志、截图录屏、故障溯源体系;
  • 深度打通 OpenClaw 指令体系与跨技能联动。

三、二次开发 + 智能化核心功能体系

(一)底层引擎增强(二次开发基础改造)

  1. 多浏览器 & 多实例管理 重构进程调度模块,支持同时启动多个浏览器实例、标签页分组,实现并行任务;区分无头模式(后台运行,省资源)与有头模式(可视化调试),支持动态切换。新增会话沙箱,不同账号、不同任务独立 Cookie、缓存、本地存储,避免账号关联、数据混淆。
  2. MCP 通信协议优化 改造原有 MCP 数据交互逻辑,增加指令队列、状态同步、心跳检测;支持长连接持续交互,解决高频指令卡顿、指令丢失问题;通信数据加密传输,防止指令与页面数据泄露。
  3. 通用行为库封装(二次开发复用) 沉淀可复用基础动作组件:页面等待、滚动浏览、悬停预览、下拉选择、文件上传、剪贴板交互、iframe 嵌套页面操作等,开发者可直接调用组件快速搭建流程,降低二次开发门槛。

(二)AI 智能元素识别(核心智能化升级)

  1. AI 视觉识别 集成图像识别能力,通过页面截图定位按钮、输入框、复选框、弹窗、广告,无需硬编码 XPath/CSS 选择器。页面布局微调、元素属性变更后仍可正常识别,大幅提升脚本稳定性。
  2. 语义文本匹配 基于自然语言理解,通过文字内容识别目标元素,例如指令 “点击登录按钮”“输入手机号”,AI 自动匹配页面对应控件,支持中文 / 英文混合页面。
  3. 组合定位策略 视觉 + 文本 + 相对位置三重校验,优先使用智能识别,识别失败自动降级为传统选择器,兼容老旧页面。

(三)真人行为仿真 & 反爬强化(二次开发定制模块)

  1. 拟人化行为模拟 二次开发鼠标轨迹算法:非线性移动、随机停留、小幅晃动;输入内容增加随机停顿、逐字输入节奏;点击操作加入随机间隔,完全模拟真人操作习惯,规避行为特征检测。
  2. 请求指纹伪装 动态轮换 UA、请求头、浏览器指纹、WebGL 信息、屏幕分辨率;支持代理池对接,单任务 / 单实例独立 IP,降低封禁概率。
  3. 智能干扰处理 AI 自动识别并关闭弹窗、广告、浮窗、引导弹窗;区分普通弹窗与安全验证弹窗,分类处理。

(四)智能异常处理 & 故障自愈(运维智能化)

  1. 多级等待策略 智能判断页面加载状态,区分网络慢、资源加载延迟、异步渲染页面,动态调整等待时长,摒弃固定延时。
  2. 异常自动修复 针对页面 404、访问超时、链接失效、元素消失等问题,执行指数退避重试,重试失败自动记录故障并跳转下一任务,不整体卡死。
  3. 断点续跑机制 长流程任务自动记录每一步状态,任务中断后可从断点继续执行,无需从头启动,适配长时间批量采集、表单填报场景。
  4. 智能验证码预判(拓展开发) 预留验证码对接接口,可二次集成识图、滑块验证解决方案,识别后自动完成验证操作。

(五)页面 AI 解析 & 数据结构化(内容智能化)

  1. 全自动内容萃取 操作完成后自动清洗页面,过滤导航栏、广告、侧边栏,精准提取正文、列表、表格、链接、图片地址。
  2. AI 结构化输出 提取内容自动整理为 Markdown/JSON/ 表格格式,识别标题、段落、数据条目、表单字段,机器可读、便于后续分析。
  3. 智能摘要 & 实体提取 对长页面、资讯、文档类网页自动生成内容摘要,提取人名、时间、数字、关键参数、联系方式等实体信息。

(六)场景化流程模板(低代码二次开发)

针对高频场景封装预制模板,支持快速调用与自定义修改,降低二次开发成本:

  • 通用模板:网页登录、账号注册、信息查询、文件下载、表单批量提交
  • 采集模板:列表页数据爬取、分页遍历、详情页批量采集
  • 巡检模板:网站定时可用性检测、页面状态监控、接口页面巡检
  • 办公模板:后台管理系统操作、数据导出、报表查看

支持用户基于模板自定义编排流程,可视化步骤增减、参数修改,支持流程导入导出复用。

(七)任务调度体系(批量 & 定时智能化)

  1. 批量任务 导入地址列表 / 账号列表,多线程并行执行,线程数可自定义限制,防止 IP 过载。支持任务优先级划分,重要任务优先执行。
  2. 定时任务 对接 OpenClaw 定时模块,配置 Cron 规则,实现定时打开页面、定时填报、定时数据采集、定时巡检。
  3. 任务状态监控 实时展示运行中、等待、成功、失败任务数量,单任务进度可视化。

(八)日志、录屏与溯源(运维智能化)

  1. 全链路日志 分级日志输出(调试 / 信息 / 警告 / 错误),记录每一步操作、元素位置、执行耗时、异常原因。
  2. 自动截图 & 录屏 关键步骤、任务失败时自动截图;长流程可开启全程录屏,便于问题复盘与二次调试。
  3. 故障智能分析 报错后 AI 自动分析失败原因(元素不存在、网络问题、反爬封禁、页面改版),给出修复建议。

(九)OpenClaw 生态联动

  1. 自然语言指令驱动 支持中文口语化指令,无需编写代码即可执行自动化操作。
  2. 跨技能数据流转 采集的网页数据自动推送至 PDF/Word、搜索、数据分析等技能,生成报表、总结文档。
  3. 消息告警 任务失败、异常拦截、巡检发现问题时,自动推送通知至短信、消息类技能。

四、分层架构设计(适配二次开发)

  1. 全局配置层:浏览器参数、代理池、UA 池、超时规则、重试次数、AI 功能开关、任务队列配置、存储路径。
  2. MCP 通信层:指令收发、心跳同步、数据加密、队列管理、异常通信重连。
  3. 浏览器实例管理层:进程创建 / 销毁、标签页管理、会话沙箱、多实例隔离。
  4. AI 智能识别层:图像识别、文本语义匹配、元素定位、弹窗 / 干扰识别。
  5. 行为仿真 & 反爬层:真人动作模拟、指纹伪装、请求头轮换、IP 代理对接。
  6. 流程引擎层:预制模板、自定义流程编排、断点续跑、批量 / 定时任务调度。
  7. 页面解析 AI 层:内容清洗、结构化提取、摘要生成、实体识别。
  8. 异常自愈层:多级等待、自动重试、故障分类、错误日志、录屏截图。
  9. 交互联动层:自然语言指令解析、结果返回、跨技能调用、告警推送。

五、核心代码实现(TypeScript・OpenClaw 原生适配)

typescript

运行

import fs from "fs-extra";
import path from "path";
import { Skill, Context } from "openclaw";
import { chromium, Browser, Page } from "playwright";

// 全局配置(支持二次开发自定义)
const PLAYWRIGHT_MCP_AI_CONFIG = {
  headless: true, // true=无头后台运行 false=可视化
  defaultTimeout: 15000,
  retryTimes: 2,
  enableAiRecognize: true, // 开启AI智能元素识别
  enableHumanBehavior: true, // 开启真人行为模拟
  enableScreenshot: true, // 异常自动截图
  taskLogDir: "./claw-data/playwright-ai/logs",
  screenshotDir: "./claw-data/playwright-ai/screenshots",
  tempSessionDir: "./claw-data/playwright-ai/sessions"
};

let globalBrowser: Browser | null = null;

// 初始化目录
async function initDir() {
  await fs.ensureDir(PLAYWRIGHT_MCP_AI_CONFIG.taskLogDir);
  await fs.ensureDir(PLAYWRIGHT_MCP_AI_CONFIG.screenshotDir);
  await fs.ensureDir(PLAYWRIGHT_MCP_AI_CONFIG.tempSessionDir);
}

// 启动浏览器实例
async function launchBrowser() {
  if (globalBrowser) return globalBrowser;
  globalBrowser = await chromium.launch({
    headless: PLAYWRIGHT_MCP_AI_CONFIG.headless,
    slowMo: PLAYWRIGHT_MCP_AI_CONFIG.enableHumanBehavior ? 200 : 0
  });
  return globalBrowser;
}

// 写入运行日志
function writeTaskLog(task: string, status: string, msg: string) {
  const logFile = path.join(PLAYWRIGHT_MCP_AI_CONFIG.taskLogDir, `${new Date().toLocaleDateString()}.log`);
  const content = `[${new Date().toISOString()}] 任务:${task} 状态:${status} 详情:${msg}\n`;
  fs.appendFileSync(logFile, content, "utf8");
}

// AI简易元素识别(模拟视觉+语义识别,可二次对接视觉模型)
async function aiFindElement(page: Page, text: string) {
  // 语义文本匹配
  const locator = page.getByText(text, { exact: false });
  const count = await locator.count();
  if (count > 0) return locator.first();
  return null;
}

// 真人点击模拟(二次开发行为算法)
async function humanClick(page: Page, target: any) {
  if (!PLAYWRIGHT_MCP_AI_CONFIG.enableHumanBehavior) {
    await target.click({ timeout: PLAYWRIGHT_MCP_AI_CONFIG.defaultTimeout });
    return;
  }
  // 随机停顿+模拟移动
  await page.waitForTimeout(Math.random() * 500 + 200);
  await target.hover();
  await page.waitForTimeout(Math.random() * 300 + 100);
  await target.click({ timeout: PLAYWRIGHT_MCP_AI_CONFIG.defaultTimeout });
}

// 访问页面 + 基础加载等待
async function visitUrl(url: string) {
  const browser = await launchBrowser();
  const page = await browser.newPage();
  await page.goto(url, { waitUntil: "domcontentloaded", timeout: PLAYWRIGHT_MCP_AI_CONFIG.defaultTimeout });
  return page;
}

// 页面AI内容萃取
async function aiExtractContent(page: Page) {
  const html = await page.content();
  const title = await page.title();
  const text = await page.locator("body").textContent();
  const summary = text ? text.slice(0, 300) + "..." : "无内容";
  return { title, summary, fullText: text };
}

// 异常截图保存
async function saveErrorScreenshot(page: Page) {
  if (!PLAYWRIGHT_MCP_AI_CONFIG.enableScreenshot) return;
  const imgPath = path.join(PLAYWRIGHT_MCP_AI_CONFIG.screenshotDir, `err_${Date.now()}.png`);
  await page.screenshot({ path: imgPath, fullPage: false });
}

// 关闭浏览器
async function closeBrowser() {
  if (globalBrowser) {
    await globalBrowser.close();
    globalBrowser = null;
  }
}

// OpenClaw 技能主入口
export const PlaywrightMcpAISkill: Skill = {
  name: "playwright-mcp-ai",
  description: "Playwright MCP AI 智能浏览器自动化|AI元素识别+真人模拟+故障自愈+页面解析+OpenClaw联动",
  patterns: [
    "打开页面{url}",
    "点击元素{text}",
    "输入内容{text} 目标{target}",
    "页面解析{url}",
    "关闭浏览器"
  ],
  handler: async (ctx: Context) => {
    const { match, pattern, reply } = ctx;
    await initDir();

    try {
      // 打开指定网页
      if (pattern === "打开页面{url}" && match.url) {
        reply(`🌐 正在访问页面:${match.url}`);
        const page = await visitUrl(match.url);
        writeTaskLog("打开页面", "成功", `地址:${match.url}`);
        return reply(`✅ 页面加载完成\n标题:${await page.title()}`);
      }

      // AI识别并点击元素
      if (pattern === "点击元素{text}" && match.text) {
        reply(`🖱️ AI识别并点击:${match.text}`);
        const page = await visitUrl("");
        const elem = await aiFindElement(page, match.text);
        if (!elem) {
          await saveErrorScreenshot(page);
          writeTaskLog("点击元素", "失败", `未识别到元素:${match.text}`);
          return reply("❌ 未找到对应页面元素,已自动截图留存");
        }
        await humanClick(page, elem);
        writeTaskLog("点击元素", "成功", `操作目标:${match.text}`);
        return reply(`✅ 已完成点击操作:${match.text}`);
      }

      // 页面AI内容解析
      if (pattern === "页面解析{url}" && match.url) {
        reply(`📄 AI正在萃取页面内容:${match.url}`);
        const page = await visitUrl(match.url);
        const res = await aiExtractContent(page);
        writeTaskLog("页面解析", "成功", `地址:${match.url}`);
        return reply(`📑 页面解析结果\n标题:${res.title}\nAI摘要:${res.summary}`);
      }

      // 关闭浏览器进程
      if (pattern === "关闭浏览器") {
        await closeBrowser();
        writeTaskLog("关闭浏览器", "成功", "浏览器进程已销毁");
        return reply("🛑 浏览器已正常关闭");
      }

    } catch (e: any) {
      writeTaskLog("通用任务", "异常", e.message);
      return reply(`❌ 执行异常:${e.message}`);
    }

    return reply("💡 可用指令:打开页面+网址、点击元素+文字、输入内容、页面解析+网址、关闭浏览器");
  }
};

六、常用指令示例(OpenClaw 直接调用)

  1. 打开页面 https://www.example.com
  2. 点击元素 登录
  3. 输入内容 123456 目标 密码框
  4. 页面解析 https://news.example.com
  5. 关闭浏览器

七、二次开发拓展方向(进阶改造点)

  1. 深度集成 AI 视觉模型 接入本地图像识别模型,实现复杂图标、按钮、滑块、验证码全自动识别,完全脱离文本依赖。
  2. 可视化流程编辑器 开发图形化拖拽编排界面,非代码人员也可自定义自动化流程,导出脚本直接运行。
  3. 代理池 & 指纹管理系统 完善代理 IP 分组、浏览器指纹库,支持按任务自动分配 IP 与指纹,强化反爬能力。
  4. 复杂流程模板扩充 新增电商下单、社交平台操作、后台批量管理、爬虫分页采集等行业专用模板。
  5. 分布式任务改造 支持多机器分布式调度,大规模批量任务拆分执行,提升整体吞吐量。
  6. 录屏功能开发 基于 FFmpeg 实现全程视频录制,适配演示、审计、故障复盘场景。
  7. 接口化对外开放 对外提供 RESTful 接口,支持外部系统调用本自动化能力。
  8. 权限与账号管理 增加多用户、多账号分组,账号密码加密存储,适配团队使用场景。

八、部署与使用步骤

  1. 环境依赖安装

bash

运行

npm install playwright fs-extra
# 安装浏览器内核
npx playwright install chromium
  1. 技能配置 修改 PLAYWRIGHT_MCP_AI_CONFIG,按需开启 / 关闭无头模式、真人模拟、自动截图、重试次数等参数。
  2. 部署加载 将技能文件放入 OpenClaw 技能目录,重启框架即可生效。
  3. 二次开发调试 关闭 headlessfalse,开启可视化窗口,方便调试流程、优化元素识别规则。

九、核心优势

AI 智能识别:摆脱固定选择器,页面改版仍可用,稳定性大幅提升;

真人行为仿真:专业行为模拟,有效规避网站反爬与风控检测;

故障自愈能力:自动重试、断点续跑、异常截图,长流程任务不易中断;

低代码二次开发:预制大量通用组件与模板,快速搭建各类自动化场景;

页面 AI 解析:自动清洗、结构化提取内容,数据可直接对接其他技能;

多任务 & 定时:支持批量、并行、定时任务,适配无人值守场景;

完整运维体系:分级日志、截图、故障分析,问题定位简单高效;

OpenClaw 原生融合:自然语言操控、跨技能数据流转、告警推送一体化。