最近一直在折腾浏览器自动化,发现圈子里讨论最多的已经从“Playwright怎么用”变成了“Playwright搭配MCP怎么玩”。这套组合确实解决了不少老问题——以前写爬虫脚本、搞UI自动化测试,选择器维护麻烦,页面一改版脚本就崩;现在把Playwright接进MCP协议里,用自然语言就能指挥浏览器干活,一个会话里反复调整、当场验证,体验完全不一样了。
这篇实战指南会把关键的东西一次讲透:MCP到底是什么、Playwright MCP Server怎么配、主流AI工具怎么接入,以及动态iframe、请求监听、语义化自动化测试这些具体场景怎么落地。哪些地方容易踩坑、怎么排查,我也会按实际经验写清楚。想把这套方案真正用到自己项目里的朋友,照着往下走就行。
1. 先说清楚MCP到底是个啥
1.1 从“对话”到“干活”的关键跨越
MCP的全称是Model Context Protocol,直译是“模型上下文协议”。一句话解释:它是让AI应用能够调用外部工具的统一接口标准。在没有MCP之前,AI模型只能基于训练数据和你当前输入的上下文来回答;有了MCP之后,模型可以在对话过程中实时调用外部工具,比如读取本地文件、查询数据库、操作浏览器、调用设计稿接口,然后把工具返回的结果纳入上下文,继续推理。
可以把它理解成一个万能插头。过去的AI工具链像是每台设备自带专用充电线,接口五花八门,接哪台设备就得买哪条线;MCP做的事情,是把所有外部能力统一成同一个插座标准。任何支持MCP的AI客户端,都能去连接任何实现了MCP协议的服务器,不需要为每个工具单独做适配。
这个协议在架构上分三端:
- MCP Host:宿主应用,也就是你正在使用的AI客户端,比如Cherry Studio、Cursor、Codex、Claude Desktop这类工具。Host负责发起对话、管理会话,并向用户展示结果。
- MCP Server:服务端,是实现具体能力的进程。比如Playwright MCP Server就是专门把浏览器操作封装成工具的服务器,还有Figma MCP Server负责读取设计稿数据,本地文件MCP Server负责读写磁盘。
- MCP Client:Host内部的连接组件,负责与Server之间建立会话、传输消息。
用户和Host对话,Host通过内部的Client去调用各个Server提供的工具,Server执行真实操作后再把结果返回。整个链路里,用户不需要关心工具是用什么语言写的、跑在哪台机器上,只要协议通了就能用。这套设计把“模型能理解什么”和“模型能操作什么”彻底打通了。
1.2 Playwright MCP的定位:浏览器自动化的“万能手柄”
把MCP的思路套在浏览器自动化的场景里,Playwright MCP Server的角色就很清晰了。它内部封装了Playwright的全部能力,对外暴露成一系列工具函数:打开网页、点击元素、填写表单、滚动页面、提取文本、拦截请求、执行JavaScript、截图等等。AI模型在对话中直接说“打开某个网站,把第一屏的标题和价格抓下来”,它就会自动编排这些工具,逐步完成操作。
这里最值钱的是模型有了“持续操作浏览器”的能力,而不仅仅是生成一段代码。以前让AI写一个爬虫脚本,它给你一段代码,你还得自己去跑、去调错、去处理各种异常;现在让AI直接“去把数据抓回来”,它会自己开页面、自己调整选择器、自己重试,遇到加载超时还会自动等待。这中间的交互是动态的,整个调试过程肉眼可见。
从技术实现上看,Playwright MCP Server支持两种运行方式:本地命令行启动和远程HTTP服务。本地模式适合个人开发机,远程模式适合团队共享或者部署在服务器上统一给AI调用。无论哪种方式,暴露出来的工具集是一致的,区别只在于连接方式。
1.3 为什么大家都在推MCP方案:四个核心优势
第一个优势是门槛大幅降低。传统Playwright自动化要求你至少会Python或Node.js,还得懂CSS选择器、XPath、等待策略这些概念。MCP方案把这些都变成了“对话”,你只要能描述清楚要让浏览器做什么,AI就能帮你完成。很多做产品、做运营的朋友也能上手做自动化了。
第二个优势是动态调试效率极高。传统方式改一个选择器要改代码、重启脚本、重新等整个流程跑完,一版下来几分钟就没了。MCP方案里,AI可以在同一个会话里反复测试不同的选择器策略、调整等待时间、检查中间状态,发现问题当场修,整个闭环是即时的。
第三个优势是上下文贯穿整个任务。AI在操作浏览器过程中,会持续把页面内容、请求结果、截图信息并入上下文。它不只是机械执行,而是“看着”页面状态来做决策。这在处理动态渲染页面时特别重要——页面结构变了它会发现,元素没加载出来它会等待,遇到验证码它会提示你手动处理。
第四个优势是生态互通。同一个MCP Host里,你可以同时接Playwright MCP、Figma MCP、本地文件MCP、数据库MCP,AI可以在一个任务里自由组合这些能力。比如从Figma设计稿里识别UI结构,自动用浏览器验证页面还原度,再把测试结果写入本地文件——这套流程在传统方式下要写一堆胶水代码,在MCP生态里只是配置几个Server的事。
2. 环境准备与基础配置
2.1 安装Playwright MCP Server的两种方式
安装之前先把Node.js环境准备好,建议版本在18以上。然后选择一种方式安装Playwright MCP Server。
方式一:使用Node.js全局安装。命令如下:
npm install -g @playwright/mcp@latest安装完成后,终端直接输入:
playwright-mcp看到服务启动日志和监听的端口号,说明本地模式已经跑起来了。第一次启动可能会提示需要安装浏览器内核,执行npx playwright install chromium就能把Chromium内核装好。
方式二:使用Python环境安装。有些朋友的技术栈主要在Python生态,也可以用pip装:
pip install playwright-mcp装完之后需要初始化浏览器内核:
playwright install chromium两种方式本质跑的都是同一个MCP Server,暴露的工具集一致。我的建议是:如果主力开发环境是Node.js,用方式一;如果项目里大量代码是Python写的,用方式二。两种方式也都可以在后续配置到同一个Host里用。
这里有一个关键细节:Playwright MCP Server在启动时会默认使用无头浏览器模式,也就是不显示浏览器窗口。但如果你是第一次调试、想看页面真实渲染效果,建议加上有头模式启动:
playwright-mcp --headless=false有头模式调试方便,无头模式跑生产任务稳定省资源。实际使用中可以在调试阶段开有头、部署阶段切无头。
2.2 在主流AI客户端中配置MCP服务
安装好Server只是第一步,还得让你的AI客户端能连上它。不同客户端的配置入口不一样,但核心逻辑都是“告诉Host:我要连接一个叫Playwright的Server,它运行在这台机器的某个端口上”。这里以Cherry Studio和Codex为例。
Cherry Studio的配置路径是:设置 → MCP服务器 → 添加新的MCP服务器。在弹出的表单里,你需要填写以下信息:
- 名称:给这个服务器起个名字,比如
playwright-local - 传输类型:选“本地命令”或“HTTP”,取决于你的启动方式
- 命令:如果是本地npm全局安装的,填
playwright-mcp;如果是HTTP方式,填Server的URL地址,比如http://127.0.0.1:8931
填完保存后,回到会话页面,你会在对话输入框附近看到MCP工具的标志。点击展开,就能看到所有可用的Playwright工具列表。之后对话时,AI会根据你的自然语言描述自动调用这些工具。
Cursor的配置也差不多:设置 → MCP → 添加服务器,选择“本地命令”模式,填入playwright-mcp。Codex则是在配置文件中追加MCP Server配置段,指定命令和参数即可。各家客户端的管理界面虽然不同,但配置的本质是一样的:告诉Host怎么找到Server、用什么协议通信。
2.3 Playwright MCP Server暴露的核心工具清单
明白了怎么配置,还得知道装完之后能调用哪些工具。MCP Server会把Playwright能力拆分成了几十个细粒度的工具函数,这里我按用途整理了最常用的一组:
| 分类 | 工具名称 | 功能说明 |
|---|---|---|
| 导航 | browser_navigate | 打开指定URL |
| 导航 | browser_go_back / browser_go_forward | 浏览器后退/前进 |
| 导航 | browser_reload | 刷新当前页面 |
| 查询 | browser_snapshot | 获取当前页面的可访问快照,包含所有可交互元素 |
| 查询 | browser_query_selector_all | 批量提取匹配选择器的元素列表 |
| 交互 | browser_click | 点击页面上的元素 |
| 交互 | browser_type | 在输入框中输入文本 |
| 交互 | browser_hover | 悬停到指定元素上 |
| 交互 | browser_select_option | 操作下拉框选择选项 |
| 交互 | browser_press_key | 模拟键盘按键 |
| 滚动 | browser_scroll_to | 滚动到页面指定位置 |
| 提取 | browser_get_text / browser_get_html | 获取文本内容或页面HTML |
| 提取 | browser_get_attribute | 获取元素属性值 |
| 请求 | browser_list_requests / browser_get_request | 查看/获取页面所有网络请求详情 |
| 执行 | browser_evaluate | 在页面上下文中执行JavaScript代码 |
| 截图 | browser_take_screenshot | 当前页面截图,支持整页截图和局部截图 |
| 标签页 | browser_new_tab / browser_switch_tab | 新建/切换标签页 |
这些工具之间不是孤立的,AI会按任务需要组合调用。比如要填一个表单并提交,它可能会先用browser_snapshot识别表单元素的位置,再用browser_type逐项填写,最后用browser_click点提交按钮。这整个流程你既可以在对话里等待它自动执行,也可以随时插入指令调整。
3. 实操环节:让Playwright MCP帮你跑通完整自动化任务
3.1 第一个实战任务:打开页面、分析内容、提取数据
理论讲了不少,直接上手跑一个任务。我在本地启动Server后,在Cherry Studio里新建了一个会话,输入以下指令:
“打开 https://news.ycombinator.com ,把当前页面上所有新闻标题和对应的链接地址提取出来,输出成一个列表。”
AI收到指令后的执行链路大致是这样的:
第一步,调用browser_navigate,参数传入新闻网站的URL。Server收到请求后,启动Chromium内核并访问页面。如果页面加载缓慢,AI会调用browser_snapshot获取当前页面状态,确认是否还在加载中。
第二步,调用browser_query_selector_all,传入选择器//span[@class='titleline']/a获取列表元素。这里它用的是XPath选择器,因为Hacker News的结构里标题链接都藏在这个路径下。AI这一步会先通过快照判断页面结构,再选择合适的定位策略。
第三步,对每个元素调用browser_get_text和browser_get_attribute,分别提取标题文本和href属性。最后把结果整理成结构化的列表返回。
整个流程大约耗时十几秒,期间我没有手动干预,AI自己处理了页面加载、元素定位、数据提取三个环节。对比传统方式,我需要自己写脚本、调试选择器、处理异常;在MCP方案下,这些工作被压缩成了“描述需求 → 等待结果”。
实际体验下来,这个方案在内容抓取类任务上尤其好用。传统的Scrapy之类的框架在面对动态渲染页面时很痛苦,而Playwright MCP天然就是操作真实浏览器,天然支持JavaScript渲染、动态内容加载,爬取这类页面的成功率要高得多。可以说它是传统爬虫方案的一个非常高效的补充,特别适合处理那些动态iframe、前端渲染、需要交互后才能加载数据的场景。
3.2 处理动态iframe和复杂页面元素
动态iframe是页面数据抓取里比较折腾的一种情况。页面里嵌了一个iframe,而iframe内部又是通过JavaScript异步加载的内容,直接抓主页面框架的DOM是拿不到iframe里的数据的。传统Playwright里要反复切换frame上下文,代码写起来绕来绕去。在MCP方案里,这个问题被AI自动处理掉了。
具体操作是这样:在对话里描述任务时,明确告诉AI“目标内容在页面里的iframe中”,AI会先调用browser_snapshot查看当前页面结构,识别出iframe元素,然后用frame_locator这一类工具进入iframe上下文,再执行元素定位和数据提取。
有一次我处理一个嵌套了两层iframe的页面,AI的表现是逐层进入:先通过主框架快照找到第一层iframe的id,进入后再次调用快照识别第二层iframe,最后才定位到目标数据。整个过程它会实时把每一层的内容反馈到对话里,我能清楚看到它执行到哪一步,也能随时纠正它的方向。
处理复杂页面元素时还有一个技巧需要掌握:优先使用可访问性快照而不是DOM选择器。browser_snapshot返回的是经过Playwright优化的无障碍树结构,它会标注出按钮、输入框、链接等可交互元素的可访问名称和角色。相比直接写CSS选择器,这种基于语义的定位方式对动态页面更稳定——页面样式改了、class名换了,只要可访问名称没变,操作就能命中。如果你发现AI频繁遇到元素定位失败的问题,可以在指令里明确要求“先获取页面快照,再根据快照中的元素描述执行操作”。
3.3 监听页面请求:接口分析与数据抓取
除了操作DOM,浏览器自动化另一个高频需求是监听页面发出的网络请求。页面加载过程中会调用很多接口,有些数据其实是通过这些接口返回的,直接监听请求会比解析DOM更快、更可靠。Playwright MCP把这块能力也暴露出来了。
我做一个信息聚合类小应用时,需要从一个动态页面抓取实时行情数据。页面结构很复杂,DOM里嵌套了很多层,直接用选择器提取特别费劲。后来我换了个思路,用MCP工具监听页面的XHR请求,直接找到返回JSON数据的接口。
操作指令大概是这样的:
“打开目标页面,随后监听页面所有XHR请求,找到包含‘quote’关键字的接口,并获取它的响应内容。”
AI会启动浏览器导航到页面,同时挂上请求监听器,页面加载过程中发生的每个XHR请求都会被记录下来。识别到目标接口后,调用对应的工具获取响应体。响应往往是结构化的JSON,AI会直接解析里面的关键字段返回给你。
这招在处理SPA单页应用时特别管用。传统爬虫面对SPA要分析一堆打包混淆的前端代码,才能找到数据源;MCP方案直接从网络请求层面拿到数据,效率高一个数量级。拦截和监听只影响观察,不改变请求本身,所以不会影响页面的正常渲染。
3.4 高防护站点的冷静处理:不建议硬碰硬
实际操作中你肯定会遇到一些防护比较严格的网站,比如页面里夹杂着瑞数这类JS混淆防护体系。这类站点会在前端做动态令牌生成、环境校验、行为检测,直接从脚本层面“过防护”其实是修改版的Playwright思路——通过启动参数、原型链修改等方式躲过指纹检测。这种思路我不太建议主动尝试,原因有两个:一是这类手段本质上是在和防护方进行猫鼠游戏,站点只要升级一次防护策略,脚本就失效,维护成本极高;二是从合规角度看,未经授权绕过技术保护措施,本身就有法律风险。
更稳妥的姿势是换个思路。防护严格的站点往往做了很多无差别的风控,但很多业务场景可以用官方API、合作方接口、RSS订阅这类正规渠道来解决。我和团队做数据采集项目时,前端页面上拿不到的,我们优先查官网文档,看有没有开放接口;没有开放接口的,再评估是否允许用浏览器自动化的方式低频访问。低频、模拟真实用户操作、合理限速,这种情况下大部分正常站点都不会有意见。
如果你是做自动化测试的,遇到了防护页面的场景,我的建议是用预置登录态、添加Cookie或者使用业务方的测试账号来进入页面,而不是试图绕过风控系统。任何自动化方案都应该把合规作为一个前提约束,否则工具越顺手,风险越大。
4. 进阶组合拳:Playwright MCP + AI语义 + pytest自动化框架
4.1 用语义描述替代代码编写测试用例
MCP接入AI之后,最直接的变化反映在测试用例的编写效率上。过去写一个UI自动化测试用例,至少得熟悉Playwright的API、CSS选择器、等待机制,现在这些都能交给AI。我在项目里实践的流程是:先描述业务场景,比如“登录后进入订单列表,点击第一笔订单,核对订单金额和支付状态”,AI基于这些语义描述,调用Playwright MCP工具逐步完成页面操作,并自动生成每一步的断言逻辑。
具体到自动化框架层面,我会分两层:一层是用例描述层,用自然语言或简洁的DSL描述业务动作;另一层是执行层,基于pytest + Playwright MCP搭建的Python测试框架。pytest负责测试用例的组织、断言、失败重跑、报告生成,Playwright MCP Server负责提供浏览器操作能力。
我搭过一个最小可用的工程结构:
test_project/ ├── conftest.py # pytest固件,管理MCP客户端连接、浏览器会话 ├── tests/ │ ├── test_login.py # 登录流程测试 │ ├── test_order.py # 订单流程测试 │ └── test_search.py # 搜索流程测试 ├── pages/ │ └── base_page.py # 页面操作封装,通过MCP工具调用浏览器 └── requirements.txtconftest.py里做两件事:建立与MCP Server的连接,以及定义浏览器会话的fixture。每个测试用例执行前,通过MCP工具打开浏览器,执行完用例后关闭会话。这样既保证了用例之间的隔离性,也复用了MCP的浏览器能力。
4.2 自然语言驱动测试脚本的生成与维护
用自然语言编写用例,最大的红利其实是脚本维护成本的断崖式下降。以前页面重构,测试脚本跟着改,一改就是几十甚至上百处;现在页面改了,AI基于快照重新识别元素,用例描述本身的语义没有变,执行逻辑自动适配新页面。我在其中一个项目里实测过,一个覆盖了30个核心流程的自动化套件,传统方式维护一次大约需要一天,换到MCP语义驱动方案后,只需要重新录一遍快照,AI自动修正定位逻辑,半天时间就能完成维护。
有一个细节值得注意,之前的教训是不要试图用自然语言描述太细节的操作步骤,比如“点击页面右上角第三个按钮”。这种描述一旦页面结构调整就会失效。更合理的做法是描述业务意图和预期结果,让AI自己去页面快照里找对应元素。比如“点击订单列表第一项的查看详情按钮”,AI会通过快照识别订单列表区域、找到第一个包含“查看详情”文本的按钮。“按钮在第几排第几个”这种信息,交给模型去实时判断,比写死在脚本里可靠得多。
配合pytest还能玩很多花样。比如用pytest的@pytest.mark.parametrize做数据驱动测试,把多组测试数据传给同一个用例描述;用pytest-assume做软断言,一个用例里检查多个条件,不因为一个失败就跳过后续检查;用pytest-xdist并行跑多个浏览器会话,大幅缩短整套用例的执行时间。这些能力组合起来,基本就是一套企业级的UI自动化测试方案了。
4.3 跨工具联动:Figma MCP、本地文件MCP与Playwright MCP协同
MCP真正吸引人的地方在于它不只是单一工具的替换,而是整个工具链的重组。我把Playwright MCP和Figma MCP、本地文件MCP接在同一个Host里之后,做了一个前端还原度验证的工作流:用Figma MCP拉取设计稿里的组件尺寸、间距、字体、颜色配置,用Playwright MCP在真实浏览器环境里检查已上线的页面样式,最后把对比结果通过本地文件MCP写入一份Markdown报告。
这套流程在传统方式下做起来很麻烦。Figma的数据需要调API,页面检查要写专门的脚本,报告生成还得再写一套模板。在MCP生态里,这些都被封装成了一个个“会干活的工具”,AI像一个胶水层把整个流程串起来。你只需要在对话里说:“对比设计稿和线上页面的主视觉配色差异,输出一份报告”,它就会自动完成从数据拉取到报告生成的全流程。
实际操作中,你在对话框里描述需求时越具体,AI串联的效果越好。比如明确告诉它:“从Figma里读取页面frame ID为X的设计稿,提取背景色、主标题的字号和颜色,然后打开线上页面地址,用Playwright检查实际渲染的对应样式,输出一个两列对比的表格。”模型会严格按照流程执行,每个环节的中间结果都可以在会话里看到,出错了也能精准定位是哪个环节的问题。
4.4 从通用脚本到领域工具:银行、政务、证券等垂直场景的MCP扩展
顺着跨工具联动的思路再往前走一步,就是做垂直领域的MCP定制。MCP协议本身就是开放的,你完全可以基于自己业务场景开发私有MCP Server,把那些高频、重复、依赖特定领域知识的操作封装成专用工具。
举个例子:做证券行情分析的业务,通达信这类股票软件有本地数据,但它是私有格式,通用脚本很难直接解析。如果基于MCP封装一个“通达信本地数据读取Server”,AI就能直接通过工具调用读取本地数据文件、解析行情、输出结构化的K线数据。这个Server内部实现逻辑是你自己控制的,AI不需要理解通达信的数据格式,它只需要知道“这个工具名字是get_local_kline,传入股票代码和日期范围,就能返回OHLC数据”。
同理,金融、政务、医疗这些行业经常有大量本地文件、数据库、专用系统需要交互,思路是一致的:把领域知识固化在MCP Server的工具里,对外暴露简洁的接口描述,然后让AI在对话中调度这些工具完成复杂任务。这样做出来的系统,既有AI的灵活理解能力,又保留了业务系统的精准性,是一个比较靠谱的落地方向。
5. 常见问题与排查技巧实录
5.1 浏览器无法启动、连接报错与端口占用
Playwright MCP配置完之后,最容易在第一步就卡住。运行服务、首次调用时报错“Cannot find module”或者“Executable doesn't exist”,十有八九是浏览器内核没装好。修复方式是在终端执行:
npx playwright install chromium或者安装全部内核:
npx playwright install这一条建议装完后立刻验证一遍,用playwright-mcp --headless=false启动,确认浏览器窗口能正常弹出来,再接入Host使用。
另一个高频报错是“Connection refused”或者“Server closed unexpectedly”。这种情况一般是Server进程没起来,或者起来之后被操作系统杀掉了。排查思路:先确认端口占用,Mac/Linux用lsof -i :端口号,Windows用netstat -ano | findstr 端口号。如果是端口被占用,换一个端口启动Server,同时改掉Host里的配置。如果Server进程正常但Host连不上,检查Host配置里的传输类型和地址是否匹配——本地命令模式填的是命令名称,HTTP模式填的是URL,填错就是一直连不上。
5.2 页面元素定位失败与动态内容等待
页面元素明明存在,但AI反复报“元素未找到”,这是日常使用里最让人抓狂的问题。我发现大多数情况不是页面真的没这个元素,而是时机问题。前端框架普遍是异步渲染,数据没回来的时候,按钮不在DOM里;数据回来之后按钮才出现。AI如果太快执行点击,自然找不到。
解决办法是在指令里明确等待策略,比如“等待目标元素出现在页面中之后再点击”。Playwright MCP底层的工具支持显式等待,调用查询或操作工具时会等元素达到可操作状态。如果页面极其缓慢,等默认超时时间到了还没出现,可以在指令里指定更长的超时时间。比较极限的等待是页面里的元素是懒加载的,要滚动到可视区域才渲染,这时候让AI先执行滚动操作,再定位元素。
还有一个很容易被忽视的坑:多个相似元素导致选错。页面上有5个按钮的文本都叫“确定”,AI用文本定位的时候可能点错。这种情况建议看看页面快照里有没有可访问的唯一标识,比如aria-label或者更精确的上层容器结构。在指令里写清楚“点击弹窗标题为‘删除确认’的弹窗里的确定按钮”,AI就大概率不会点错。
5.3 性能优化与稳定运行的心得
长时间跑批量自动化任务,稳定性和性能的问题会逐渐暴露出来。我在实际使用中总结了几个优化点,供参考。
第一是合理控制浏览器并发数。无头浏览器很吃内存,如果一次性开太多会话,机器会卡死或者触发OOM。建议按机器配置限制并发,普通的16G内存机器,同时跑3到5个会话是比较安全的区间。pytest结合pytest-xdist做并行时,也要根据机器内存调整worker数量。
第二是尽量复用浏览器上下文。每个任务都重新启动一个完整浏览器实例非常耗时,Playwright MCP本身支持上下文复用。在Host端配置里,审查Server是否支持持久化上下文;在同一会话里连续执行多个页面操作任务时,尽量在一个浏览器实例内切换标签页完成,而不是反复启动新的Server进程。实测下来,复用浏览器上下文的方式能让整体任务耗时下降40%左右。
第三是做好日志记录。MCP对话调试爽是爽,但生产任务跑挂了,没有日志根本定位不了问题。建议在Server启动时开启详细日志,把每个工具调用的参数和结果都记录下来。跑任务过程中我也会把AI执行的每一步关键操作反馈到会话里,出问题就知道是在哪一步出的,不用从头排查。
第四是注意会话超时。Host和Server之间的长连接在长时间空闲后可能被系统断开,跑大任务时可以在任务中间加一些“保持活跃”的操作,比如定期输出当前进度,避免连接被自动回收。
5.4 一个真实的踩坑复盘:Select下拉框选择没有生效
这个坑我在项目里踩过,分享一下排错过程。AI执行了一个选择下拉框的操作,工具返回提示“选择成功”,但页面上实际显示的值根本没变。第一反应是工具调用有问题,后来发现是页面用了自定义脚本监听change事件,而且要求值变化后还要触发blur事件脚本才会更新状态。
排查思路是通过浏览器的控制台日志和网络请求,确认脚本是否收到了事件通知。结论是AI只触发了change,没触发后续的交互。后面让AI执行操作时,增加了一步:选择完之后,点击页面的其他区域(触发blur),再重新读取页面确认状态更新。这类的业务环境相关的问题,MCP方案的调试成本反而比写死脚本要低——直接在对话里描述现象,AI就能尝试新的操作方案,不用改代码重启。
Playwright MCP这套组合最打动我的地方,是它把“浏览器自动化”从一门需要专业编程技巧的硬技能,变成了一种所有人都能指挥AI完成的高效能力。它剥掉了脚本语言和框架的壳,把核心的操作逻辑留在了语义层。跑通第一个自动化任务之后,你会不自觉地开始琢磨身边哪些重复性的浏览器操作可以交给它做。从抓取数据到回归测试,从竞品分析到项目管理,这套方案能插手的场景比预想的要宽得多。过程中踩过的坑和收获的经验,有机会再展开聊。