Browserose MCP
MCP代理工具,用于控制谷歌Chrome浏览器。
Browserose MCP是一个MCP(模型上下文协议)服务器,允许AI代理和IDE进行控制 谷歌浏览器 通过剧作家,与完整 iframe支持:在iframe内进行快照和交互(例如ALM SCORM播放器、嵌入式应用程序)。
该工具集足以实现完全的端到端自动化。 您可以完成整个流程——登录、多步导航、嵌套iframe、测验和课程完成——而无需手动步骤或切换选项卡。根据需要使用导航、定位器、帧选择器、坐标回退和诊断。
需求
- Node.js 18+
- Chrome已安装(或已设置
PLAYWRIGHT_MCP_USE_CHROMIUM=1使用铬) - 剧作家浏览器:
npx playwright install chromium(或chrome如果可用)
安装和构建
npm install
npx playwright install chromium
npm run build光标/IDE配置
增添 ~/.cursor/mcp.json (或项目 .cursor/mcp.json):
{
"mcpServers": {
"playwright-chrome": {
"command": "node",
"args": ["/absolute/path/to/Browserose-MCP/build/index.js"]
}
}
}编辑后重新启动游标 mcp.json.
环境变量
PLAYWRIGHT_MCP_HEADLESS--设置为1或true无头运行浏览器(默认:headed以便看到窗口)。PLAYWRIGHT_MCP_USE_CHROMIUM--设置为1或true使用Playwright的Chromium而不是系统Chrome。PLAYWRIGHT_MCP_VIEWPORT_MAXIMIZED--窗口打开 默认最大化。设置为0或false使用固定尺寸(见下面的宽度/高度)。PLAYWRIGHT_MCP_VIEWPORT_WIDTH--视口宽度(像素)(默认值:1280).仅在禁用最大化时使用。PLAYWRIGHT_MCP_VIEWPORT_HEIGHT--视口高度(像素)(默认值:800).仅在禁用最大化时使用。
示例: 要使用固定大小而不是最大化,请设置 PLAYWRIGHT_MCP_VIEWPORT_MAXIMIZED=0 并且可选 PLAYWRIGHT_MCP_VIEWPORT_WIDTH=1920, PLAYWRIGHT_MCP_VIEWPORT_HEIGHT=1080.
弹出处理程序
当链接或按钮打开时 新标签页 (例如。 转到活动 在IBM SkillsBuild上,将在新窗口中打开SCORM播放器),MCP 自动附加到该新选项卡浏览器上下文监听 page 事件;当创建新页面时,内部 page 参考已更新,以便 所有后续工具调用(导航、单击、快照、frame_probe等)都在新选项卡中运行不是原来的那个。您不需要手动切换选项卡或使用单独的“切换到选项卡”工具:单击 转到活动,等待播放器加载,然后继续使用相同的工具——它们将已经指向播放器选项卡。实现:in src/browser.ts, context.on("page", (newPage) => { page = newPage; }) 在每个新页面上运行(弹出或目标=\_blank)。在拉取更改后重新启动MCP服务器(或Cursor),使处理程序处于活动状态。
工具(快速参考)
| 工具 | 目的 |
|---|---|
browser_navigate | 转到URL |
browser_go_back / browser_go_forward | 历史 |
browser_snapshot | 可访问性,如页面树;使用 includeFrames: true 包含同源iframe |
browser_snapshot_frame | 通过选择器快照单个iframe(例如。 iframe, iframe#pplayer_iframe) |
browser_click | 参照点击;可选的 frameSelector 对于iframe中的元素 |
browser_type | 键入文本;可选的 ref, frameSelector, submit |
browser_type_locator | 按角色/text/css键入元素;可选的 frameSelector (省略=主页) |
browser_hover | 按ref悬停;可选的 frameSelector |
browser_select_option | 参照选择选项;可选的 frameSelector |
browser_press_key | 按一个键;可选的 frameSelector |
browser_screenshot | 页面或iframe截图;可选的 frameSelector |
browser_click_at | 点击 (x, y) 相对于帧的视口(当引用失败时用于画布/交叉原点);需要 frameSelector, x, y |
browser_click_locator | 按定位器单击: role+name, text,或 css.可选: nth (基于0的指数), enabledOnly (第一次启用匹配), scopeCss (容器内)。不需要快照。 |
browser_list_clickables | 在框架中列出可单击项。 需要 frameSelector 当定位iframe(例如内容框架)时。可选过滤器: role, name, text, css; enabledOnly; scopeCss (容器内)。用于发现要单击的内容。 |
browser_frame_probe | 诊断:在框架内运行以获取url、标题、readyState、按钮/可点击计数、textSample。如果探测失败或计数=0,则UI可能是画布。 |
browser_frame_bbox | 获取页面坐标中的帧边界框(x、y、宽度、高度)。 |
browser_click_at_rel | 在框架内0..1的相对(rx,ry)处单击(例如0.5,0.9=中心底部)。使用Playwright page.mouse.click。 |
browser_frame_inventory | 内部框架:列出子iframe(id、name、src、rect)、canvas(rect),shadowHosts计数,bodyRect。用于查看UI是在嵌套的iframe还是画布中。 |
browser_hit_test_rel | elementFromPoint在帧中的(rx,ry)处;返回标签、id、类、rect、pointerEvents、游标(以及iframe src/name)。确认点击的位置。 |
browser_click_at_rel_debug | 帧截图+带有页面坐标和帧内像素的文本,其中click_at_rel(rx,ry)会点击。 |
browser_evaluate_click | 通过DOM点击框架中的元素 .click() (帧选择器+css;可选第n个)。绕过可见性/可操作性。当测验提交或其他按钮失败时使用。 |
browser_evaluate_click_by_text | 按框架中的文本内容单击(框架选择器+文本;可选匹配精确/包含、范围、n)。绕过可见性/覆盖。当测验选项或标签对定位器/click_at_rel没有响应时使用 |
browser_wait | 睡眠(秒) |
______________________________________________________________________
工具参考和用例
每个工具的详细说明以及何时使用。可选 frameSelector 用途 >> 对于嵌套的iframe(例如。 iframe#a >> iframe#b).
导航
| 工具 | 功能 | 用例 |
|---|---|---|
browser_navigate | 在当前选项卡中打开一个URL。 | 启动流、打开登录页面、课程URL或任何目标网站。 |
browser_go_back | 追溯历史。 | 撤消导航或从重定向返回。 |
browser_go_forward | 在历史上前进。 | 返回后重复一步。 |
基于快照和引用的交互
这些工具使用可访问性/DOM快照来获取 参考文献 (例如。 s1e2).然后,您可以将该引用传递给单击、键入、悬停或选择。当页面(或iframe)具有相同的来源并具有正常的DOM时,效果最佳。
| 工具 | 功能 | 用例 |
|---|---|---|
browser_snapshot | 捕获当前页面的可访问性树。使用 includeFrames: true 包含同源iframe。 | 在一次调用中发现结构并获取主页和嵌入式框架的引用。 |
browser_snapshot_frame | 按选择器快照单个iframe。用于链式选择器(>>),在无法进行帧内评估时使用CDP。 | 检查一帧树;获取该帧内元素的引用(相同的源或CDP可以提供引用的时间)。 |
browser_click | 点击由参考标识的元素。可选 frameSelector 当元素位于iframe内部时。 | 按钮、链接、复选框——快照中任何可点击的内容。 |
browser_type | 在焦点元素或由ref标识的元素中键入文本。可选 frameSelector, submit (按Enter键)。 | 文本输入、搜索框、登录字段。 |
browser_hover | 将鼠标悬停在由ref标识的元素上。可选 frameSelector。 | 单击前打开下拉菜单或工具提示。 |
browser_select_option | 通过引用在下拉列表中选择选项可选 frameSelector。 | 选择元素、语言选择器、过滤器。 |
browser_press_key | 发送一个键(例如Enter、Tab、ArrowRight)。可选的 frameSelector 以瞄准一帧。 | 提交表单、键盘导航、转义模式。 |
基于定位器的交互(无快照)
这些工具使用Playwright定位器(角色+名称、文本或css)和 不需要快照。它们在跨源iframe中工作,当引用不可用或快照为空时,它们是主要的逃逸窗口。
| 工具 | 功能 | 用例 |
|---|---|---|
browser_click_locator | 按定位器单击元素: role+name, text,或 css.可选: nth (基于0的匹配指数), enabledOnly (当几个被禁用时,单击第一个启用的匹配), scopeCss (仅在此容器选择器内解析)。 | 跨源iframe、登录按钮、SCORM“下一步”、存在多个提交时的测验“提交”(使用 enabledOnly: true 或 nth),卡片内的文字(使用 scopeCss: ".quiz-card" 以避免侧边栏)。 |
browser_type_locator | 键入由role/text/css找到的元素。可选: nth (基于0的指数), scopeCss (容器内)。 | 登录字段、搜索框、不使用快照时的任何输入;当多个输入匹配时,使用 nth 或 scopeCss. |
browser_list_clickables | 列出框架中可见的按钮/链接。可选: role, name, text, css (筛选匹配列表), enabledOnly (仅启用列表), scopeCss (仅在容器内列出)。 | 发现什么是可点击的;仅列出“提交”按钮(role: "button", name: "SUBMIT")查看哪个已启用;仅列出测验区域内的可点击内容(scopeCss). |
按情况定制: 使用 nth 当多个元素匹配时(例如,名为“提交”的第四个按钮)。使用 enabledOnly 单击第一个 启用 当DOM有多个禁用副本时,进行匹配。使用 scopeCss 将搜索限制在容器内(例如。 .quiz-card, [role="dialog"])因此,您不会在侧边栏或其他面板中匹配相同的文本或角色。
基于坐标的交互(逃生口)
当快照和定位器都失败时(例如画布、自定义渲染UI或错误的帧深度),请使用相对于帧的坐标。
| 工具 | 功能 | 用例 |
|---|---|---|
browser_frame_bbox | 返回帧的边界框(x、y、宽度、高度) 页 协调。 | 将相对位置转换为绝对(x,y) browser_click_at或理解帧位置。 |
browser_click_at | 像素点击次数 (x, y) 相对于帧的视口。需要 frameSelector, x, y. | 当您知道确切的坐标时(例如从屏幕截图中),可以使用画布或非DOM UI。 |
browser_click_at_rel | 点击次数: 相对的 位置 (rx, ry) 在 [0..1] 在框架内(例如。 0.5, 0.9 =中心底部)。使用剧作家的鼠标。 | 当没有像素坐标时,单击帧的“右下角”或“中心”;快速回退已知布局。 |
browser_click_at_rel_debug | 返回帧的屏幕截图 和 精确的页面坐标和帧内像素,其中 click_at_rel(rx, ry) 会点击。 | 调试:使用前确认(rx,ry)落在正确的元素上 browser_click_at_rel. |
诊断(找到正确的帧/层)
当一个框架在快照中没有显示按钮或空文本时,真正的UI通常位于 子iframe, 画布,或 阴影DOM。这些工具可以帮助你找到它。
| 工具 | 功能 | 用例 |
|---|---|---|
browser_frame_probe | 在框架内运行一个小脚本:返回 url, title, readyState,按钮/可点击按钮的数量,以及一个简短的 textSample. | 快速检查:“此帧是否有DOM?”如果 buttons: 0, clickables: 0, textSample: "",可见UI可能位于子iframe或画布中。 |
browser_frame_inventory | 列表 子iframe (id、name、src、rect), 画布 元素(rect)、阴影根计数,以及 bodyRect当探测器显示“无内容”时:找到真实的内容帧(例如ALM SCORM的 iframe#content-frame)或者确认UI是画布。然后扩展帧选择器链并在该帧中使用定位器。 | |
browser_hit_test_rel | 用途 elementFromPoint(rx*width, ry*height) 在框架内;返回标签、id、类、rect、pointerEvents、游标;对于iframe,src/name。 | 验证相对点(rx,ry)点击了哪个元素,例如“(0.5,0.92)真的是下一步按钮还是叠加?” |
效用
| 工具 | 功能 | 用例 |
|---|---|---|
browser_screenshot | 截取整个页面或特定iframe的屏幕截图(frameSelector). | 视觉验证、调试布局或输入视觉模型。 |
browser_wait | 暂停给定的秒数。 | 让页面或iframe在快照或单击之前完成加载。 |
______________________________________________________________________
实践中的用例
- 普通web自动化(主页)\
使用 browser_snapshot (或 browser_snapshot_frame 无嵌套/最小嵌套)以获取引用,然后 browser_click, browser_type, browser_hover, browser_select_option 与这些裁判。可选的 browser_screenshot 用于验证。
- 登录流程\
通常在主页上: browser_type_locator 和 browser_click_locator 随着 role/name 或 text (例如电子邮件→ 继续→ 密码→ 登录)。不需要快照。
- 单一iframe,同源\
browser_snapshot_frame 随着 frameSelector: "iframe#id" → 获取参考文献→ browser_click / browser_type 与相同 frameSelector.
- 跨源或“空”iframe\
快照可能为空或引用可能不起作用。请使用 定位器: browser_list_clickables 随着 frameSelector 那么,看看那里有什么 browser_click_locator 和 browser_type_locator 与相同 frameSelector 以及角色/文本/css。
- ALM/SCORM(嵌套iframe)\
可见的课程UI通常位于 三级 iframe。如果 browser_frame_probe 上 iframe#pplayer_iframe >> iframe#modulePlayerIframe 显示 clickables: 0,跑 browser_frame_inventory 在那条链子上;它将列出子iframe(例如。 iframe#content-frame).将链条延伸至 ... >> iframe#content-frame 和使用 browser_list_clickables 和 browser_click_locator (例如。 role: "button", name: "Next")在那里。一句话:当框架没有DOM内容时,使用 框架_库存 要找到真正的内容iframe,然后将其添加到链中。
- 画布或自定义渲染UI\
如果frame_inventory显示了一个大画布,但没有有用的iframe,或者定位器不匹配:使用 browser_click_at_rel_debug 看看(rx,ry)降落在哪里,然后 browser_click_at_rel 调整后的(rx,ry),或 browser_frame_bbox + browser_click_at 计算(x,y)。
- 测验/多个相同按钮\
当存在多个“提交”或“下一步”按钮,但只有一个被启用时,使用 browser_click_locator 随着 enabledOnly: true (同样 role/name)因此,第一个启用的匹配被点击。或使用 browser_list_clickables 随着 role: "button", name: "SUBMIT" (以及可选 enabledOnly: true)要查看索引,请单击 nth.使用 scopeCss (例如。 .quiz-card)仅限于当前问题卡,避免与侧边栏匹配。
- 调试“点击不起作用”\
检查:(1)框架是否正确? → browser_frame_probe 和 browser_frame_inventory(2)正确的元素? → browser_list_clickables 在该框架内; browser_hit_test_rel 看看下面是什么(rx,ry)。(3)正确的坐标? → browser_click_at_rel_debug(4)多场比赛? → use nth 或 enabledOnly.
______________________________________________________________________
端到端:IBM技能构建/ALM课程
您可以仅使用Browserose MCP工具运行整个课程流程:从IBM页面到登录、学习计划、启动活动以及完成课程和测验。
1.从IBM页面开始并登录
- 导航 转到课程或计划URL(例如。
https://skills.yourlearning.ibm.com/activity/PLAN-...). - 如果重定向到登录:
browser_click_locator随着text: "Log in with ibm"(或同等)。在IBM登录页面上:
- browser_type_locator 随着 role: "textbox", name: "IBMid",以及电子邮件。 - browser_click_locator 随着 role: "button", name: "Continue". - browser_type_locator 随着 role: "textbox", name: "Password",以及密码。 - browser_click_locator 随着 role: "button", name: "Log in".
- 使用
browser_wait和browser_screenshot根据需要确认下一页。
2.打开学习计划和模块
- 从计划页面:
browser_click_locator随着text: "Microcredential 1: Data Classification"(或右侧部分)。 - 然后
browser_click_locator随着text: "Classifying and Sourcing Data"(或目标模块)。 - 启动活动:
browser_click_locator随着role: "button",name: "Go to activity". - 等待玩家: 点击 转到活动 可以打开SCORM播放器 新标签页MCP会自动附加到新选项卡(弹出处理程序),因此下一个工具调用将在播放器选项卡中运行。使用
browser_wait(例如5-8秒),然后browser_frame_probe或browser_frame_inventory上iframe#pplayer_iframe(然后iframe#pplayer_iframe >> iframe#modulePlayerIframe如果需要),直到内容帧出现。可见的课程UI位于 内容框架:\
iframe#pplayer_iframe >> iframe#modulePlayerIframe >> iframe#content-frame
3.内容框架:课程和“继续”
- 继续/下一步(内容):\
browser_click_locator 随着 frameSelector: "iframe#pplayer_iframe >> iframe#modulePlayerIframe >> iframe#content-frame", css: "button.continue-btn".
- 使用
browser_list_clickables说完这个frameSelector发现按钮(例如“下一步”、“继续”)。使用browser_screenshot说完这个frameSelector当你需要看到屏幕上的内容时。
4.练习题:两遍策略
最快的通过方式是:(1)第一次通过——任意回答,提交, 从反馈中读取正确答案,记住它;2. 再来一次(3)第二遍——用记住的正确选项作答并提交。
- 开始或重新开始测验:\
browser_click_locator 在内容框架中 text: "START QUIZ" 或 text: "TAKE AGAIN".
- 选择一个选项:\
如果定位器像 #qmc-X-label 被覆盖物覆盖,使用 browser_click_at_rel 在内容框架中,例如。 rx: 0.5,以及 ry 大致:第一个选项~0.48-0.52,第二个选项~0.56-0.6,第三个选项~0.64-0.68(如果布局不同,请调整)。或使用 browser_hit_test_rel / browser_click_at_rel_debug 以确认。
- 提交:\
browser_click_locator 在内容框架中 role: "button", name: "SUBMIT", enabledOnly: true (因此单击了活动的SUBMIT)。
- 阅读反馈:\
提交后,使用 browser_frame_probe 在内容框架上阅读 textSample (或使用 browser_screenshot)获取“正确答案:…”,并按问题索引(Q1、Q2、…)存储。
- 下一个问题:\
browser_click_at_rel 在内容框架中 rx: 0.65, ry: 0.85 (下一步按钮区域)。重复直到测验完成(不再提交或看到完成)。
- 第二遍:\
点击 再来一次,然后对于每个问题,单击与存储的正确答案匹配的选项(通过 ry 如果正确的选项文本是可点击的,则通过标签或定位器), 提交,然后单击(0.65,0.85)进行下一步,直到测验完成。
5.完成测验并完成模块后
- 测验完成后,使用
browser_click_locator在内容框架中css: "button.continue-btn"(或等效)继续下一课或关闭模块。 - 在后续的课程和测验中重复相同的模式,直到模块/课程标记为完成。
摘要: 所有步骤——登录、计划导航、“进入活动”、等待玩家、继续上课、测验(两次通过,包括阅读反馈和重新开始)和完成——都可以用现有的工具(导航、点击指示器、键入指示器、列表可选项、frame_probe、frame_inventory、点击_at_rel、截图、等待)完成。无需手动切换标签或使用外部工具。
______________________________________________________________________
使用iframe(包括跨源/ALM SCORM)
- 导航到包含iframe的页面(例如ALM课程页面)。
- 呼叫
browser_snapshot随着includeFrames: true获取主页和同源iframe,或调用browser_snapshot_frame随着frameSelector: "iframe"(或iframe#id)只得到那帧的树。 - 使用返回的参考值
browser_click,browser_type,等等,并通过相同的frameSelector。对于嵌套的iframe,使用链式选择器>>例如。iframe#pplayer_iframe >> iframe#modulePlayerIframe.
示例:在第一个iframe中单击“下一步”:
browser_snapshot_frame随着frameSelector: "iframe"→ 获取“下一步”按钮的参考(例如。f1e2).browser_click随着ref: "f1e2",frameSelector: "iframe".
逃生舱(交叉起点/SCORM): 对于快照失败的帧,直接使用Playwright定位器(无AX/DOMSnapshot):
browser_list_clickables随着frameSelector: "iframe#pplayer_iframe >> iframe#modulePlayerIframe"→ 列出带有文本和启用/禁用的按钮/链接。- ALM烧焦: 可见的课程UI(例如“下一步”、“学习目标”)位于 三级 iframe。使用
browser_frame_inventory上iframe#pplayer_iframe >> iframe#modulePlayerIframe查看子iframe;然后链接到内容帧:iframe#pplayer_iframe >> iframe#modulePlayerIframe >> iframe#content-frame.使用该选择器browser_list_clickables和browser_click_locator(例如。role: "button",name: "Next"). browser_click_locator与相同frameSelector和role: "button",name: "Next"(或text: "Next") → 单击元素。之所以有效,是因为剧作家直接针对画面的背景。
交叉原点/SCORM(AX树为空): 服务器还对帧使用3层快照:
- A级 --CDP
Accessibility.getFullAXTree(参考文献backendDOMNodeId;通过框模型单击)。 - B级 --如果AX为空,CDP
DOMSnapshot.captureSnapshot(参考视口坐标;单击通过Input.dispatchMouseEvent). - C级 --使用
browser_screenshot随着frameSelector那么browser_click_at与相同frameSelector和(x, y)按坐标单击(例如画布或AX和DOM快照都失败时)。
______________________________________________________________________
许可证和作者
- 许可证: 这个项目是 开源.自由使用和修改。
- 开发商: 埃塔利·奥马尔
