资讯中心

600行Python代码构建AI浏览器智能体:从CDP协议到自动化实战

📅 2026/8/25 1:51:18
600行Python代码构建AI浏览器智能体:从CDP协议到自动化实战
1. 项目概述当AI智能体接管你的浏览器想象一下你有一个不知疲倦、不会抱怨、且能精确执行你所有指令的数字助手。它能在你睡觉时自动整理资料在你开会时帮你填写繁琐的表格甚至能根据你的描述在复杂的网页应用里完成一系列操作。这听起来像是科幻电影里的场景但今天通过一个名为“Browser Harness”的工具用大约600行Python代码你就能亲手打造这样一个“浏览器统治者”赋予AI智能体在数字世界里的完全行动自由。Browser Harness的核心是一个轻量级但功能强大的浏览器自动化控制框架。它不像传统的、笨重的浏览器自动化工具那样需要你手动录制宏或编写复杂的脚本去定位每一个按钮。相反它提供了一套简洁的API让你能够以编程的方式像指挥一个真实的用户一样指挥浏览器执行点击、输入、导航、截图、提取数据等几乎所有操作。更重要的是它的设计哲学是与AI智能体AI Agent深度结合。你可以将浏览器的“眼睛”页面内容和“手”操作能力直接暴露给一个大语言模型如GPT、Claude等让AI来理解页面、做出决策并执行动作从而实现真正智能的、基于自然语言的任务自动化。这解决了什么痛点对于开发者、测试工程师、数据分析师乃至普通办公人员来说大量重复性的、基于网页的操作是效率的黑洞。无论是每日的数据报表抓取、跨系统的信息录入、竞品监控还是复杂的Web应用测试手动操作既耗时又易错。Browser Harness将这种底层、机械的交互抽象出来让开发者可以专注于更高层的业务逻辑和AI决策极大地提升了自动化任务的开发效率和智能水平。它适合任何希望将网页操作自动化并愿意探索AI与自动化结合可能性的Python开发者。2. Browser Harness的核心设计哲学与架构拆解2.1 为什么是600行代码极简主义的威力“600行代码统治浏览器”这个说法并非噱头它深刻地揭示了Browser Harness的设计精髓通过精炼的核心抽象实现最大化的控制能力。在软件工程中代码行数少往往意味着更高的内聚性、更清晰的抽象和更低的维护成本。Browser Harness没有试图重新发明轮子去实现一个完整的浏览器内核而是巧妙地站在了巨人——Chrome DevTools Protocol (CDP) 的肩膀上。CDP是Chrome浏览器提供的一套基于WebSocket的调试协议它允许外部工具对浏览器进行深度检查和操控。市面上许多强大的工具如Puppeteer和Playwright其底层也依赖于CDP。Browser Harness的聪明之处在于它没有像这些大型框架一样封装所有可能的复杂场景而是只提取了最核心、最必要的CDP指令封装成一组极其简洁的Python函数。这600行代码主要完成了以下几件事连接管理建立与Chrome/Chromium实例的WebSocket连接并维持会话。核心指令封装将常用的CDP命令如Page.navigate,DOM.querySelector,Input.dispatchMouseEvent,Runtime.evaluate等包装成易于调用的方法。智能等待与状态同步实现基本的等待页面加载、等待元素出现的逻辑这是自动化脚本稳定性的关键。与AI的接口适配设计数据结构和返回格式便于将页面DOM信息、截图等上下文传递给大语言模型并解析AI返回的指令来执行操作。这种极简设计带来了几个显著优势学习曲线极低开发者可以快速理解整个框架的运作原理依赖极少通常只需要websockets和asyncio等Python标准库或轻量级第三方库极其灵活因为底层是原始的CDP你可以轻松扩展任何CDP支持但框架未直接封装的功能最后与AI集成天然友好简洁的API使得AI更容易理解和生成正确的控制指令。2.2 架构分层连接层、指令层与智能体层为了更清晰地理解其工作方式我们可以将Browser Harness的架构分为三个逻辑层次第一层连接与通信层这是最底层负责与真实的浏览器进程“对话”。它通过启动一个带有--remote-debugging-port参数的Chrome实例打开一个特定的端口如9222。然后Browser Harness的核心代码会连接到这个端口获取可调试的页面目标列表并最终与目标页面建立独立的WebSocket连接。所有后续的指令都将通过这个WebSocket连接以JSON格式发送给浏览器的CDP后端。注意确保你使用的Chrome/Chromium版本与CDP协议版本兼容。通常较新的版本问题较少。如果遇到连接问题检查防火墙是否阻止了本地回环地址localhost的特定端口通信。第二层指令封装与执行层这是框架的主体将CDP的原始JSON指令封装成直观的Python方法。例如goto(url): 对应Page.navigate。query_selector(selector): 对应DOM.querySelector并返回一个代表DOM节点的对象。click(node): 对应Input.dispatchMouseEvent并可能前置执行DOM.scrollIntoViewIfNeeded确保元素可见。type_text(node, text): 模拟键盘输入涉及Input.dispatchKeyEvent序列。screenshot(): 调用Page.captureScreenshot并保存为图片或base64数据。evaluate_script(js): 在页面上下文中执行JavaScript并返回结果这是提取数据和与页面交互的利器。这一层还包含了稳定性增强逻辑比如在点击前自动等待元素可交互在导航后等待networkIdle事件这些是编写健壮自动化脚本不可或缺的。第三层AI智能体集成层这是让Browser Harness从“自动化工具”升维为“智能体”的关键。这一层并非硬编码在600行内而是提供了一种设计模式。其核心流程是观察将当前页面的关键信息如URL、页面标题、可视区域的HTML摘要或结构化数据、甚至屏幕截图作为上下文Context提供给AI。规划AI根据任务目标如“登录邮箱找到最新一封来自某人的邮件下载附件”和当前上下文规划下一步动作如“在id为’username’的输入框输入’myemailexample.com’”。执行将AI规划的动作翻译成Browser Harness第二层的指令并执行。反馈循环执行后获取新的页面状态再次交给AI观察和规划形成“感知-思考-行动”的闭环。这个循环可以完全由开发者控制也可以利用LangChain、AutoGPT等智能体框架来搭建更复杂的决策逻辑。3. 从零开始搭建你的第一个Browser Harness智能体3.1 环境准备与工具选型工欲善其事必先利其器。虽然Browser Harness核心轻量但一个舒适的开发环境能事半功倍。Python环境推荐使用Python 3.8或更高版本。使用venv或conda创建独立的虚拟环境是最佳实践可以避免包依赖冲突。# 创建虚拟环境 python -m venv browser_agent_env # 激活虚拟环境 (Windows) browser_agent_env\Scripts\activate # 激活虚拟环境 (MacOS/Linux) source browser_agent_env/bin/activate核心依赖安装Browser Harness的核心依赖非常少。假设我们将其核心代码保存为一个名为browser_harness.py的文件我们主要需要能处理WebSocket和异步操作的库。pip install websockets aiohttpaiohttp在这里可能用于更复杂的HTTP请求如下载文件websockets是连接CDP的必备库。浏览器准备你需要安装Chrome或Chromium。确保可以通过命令行启动。为了自动化我们通常以无头模式无界面启动但调试时建议使用带界面的模式。# 启动一个可供调试的Chrome实例带界面便于调试 chrome --remote-debugging-port9222 --user-data-dir/tmp/chrome_profile--user-data-dir指定了一个独立的用户数据目录避免干扰你日常使用的浏览器配置。开发工具VS Code是绝佳选择。安装Python扩展和Pylance语言服务器它能提供优秀的代码补全和类型提示。对于调试可以使用VS Code内置的调试器或者简单的print语句。由于涉及异步编程确保你熟悉asyncio的基本用法。3.2 核心代码解析与手把手实现让我们深入那600行代码的精华部分并理解如何调用。以下是一个高度简化的核心类结构示意# browser_harness.py (简化核心) import asyncio import websockets import json class BrowserHarness: def __init__(self, ws_url): self.ws_url ws_url self.websocket None self.message_id 0 async def connect(self): 连接到CDP WebSocket端点 self.websocket await websockets.connect(self.ws_url) # ... 初始化会话获取目标页面等细节 async def send_command(self, method, paramsNone): 发送CDP命令并等待响应 self.message_id 1 cmd {id: self.message_id, method: method, params: params or {}} await self.websocket.send(json.dumps(cmd)) # 等待并解析响应... return result async def goto(self, url): 导航到指定URL return await self.send_command(Page.navigate, {url: url}) async def query_selector(self, selector): 查找元素 # 首先需要获取文档根节点ID root_node await self.send_command(DOM.getDocument) node_id await self.send_command(DOM.querySelector, { nodeId: root_node[root][nodeId], selector: selector }) return {nodeId: node_id[nodeId]} if node_id[nodeId] else None async def click(self, node): 点击元素 # 1. 确保元素可见滚动到视口 await self.send_command(DOM.scrollIntoViewIfNeeded, {nodeId: node[nodeId]}) # 2. 获取元素的坐标框 box_model await self.send_command(DOM.getBoxModel, {nodeId: node[nodeId]}) box box_model[model][content] x, y (box[0] box[2]) / 2, (box[1] box[5]) / 2 # 计算中心点 # 3. 发送鼠标事件 await self.send_command(Input.dispatchMouseEvent, { type: mousePressed, x: x, y: y, button: left, clickCount: 1 }) await asyncio.sleep(0.05) # 微小延迟模拟人类 await self.send_command(Input.dispatchMouseEvent, { type: mouseReleased, x: x, y: y, button: left, clickCount: 1 }) async def type_text(self, node, text): 向元素输入文本 # 先点击元素聚焦 await self.click(node) for char in text: await self.send_command(Input.dispatchKeyEvent, { type: keyDown, text: char }) await asyncio.sleep(0.02) # 模拟打字间隔 await self.send_command(Input.dispatchKeyEvent, { type: keyUp, text: char })以上代码展示了最核心的连接和几个基本操作。一个完整的实现还需要处理事件监听如页面加载完成、错误处理、资源清理等。实操第一步启动浏览器并连接import asyncio import subprocess from browser_harness import BrowserHarness async def main(): # 1. 启动Chrome假设已手动启动或通过subprocess启动 # subprocess.Popen([chrome, --remote-debugging-port9222, --user-data-dir/tmp/test]) # 2. 获取调试URL。通常需要先访问 http://localhost:9222/json/list 获取WebSocket URL import aiohttp async with aiohttp.ClientSession() as session: async with session.get(http://localhost:9222/json/list) as resp: targets await resp.json() ws_url targets[0][webSocketDebuggerUrl] # 取第一个页面目标 # 3. 创建并连接Harness harness BrowserHarness(ws_url) await harness.connect() # 4. 启用必要的CDP域如Page, DOM, Input await harness.send_command(Page.enable) await harness.send_command(DOM.enable) await harness.send_command(Input.enable) # 5. 开始自动化任务 await harness.goto(https://www.example.com) print(已导航到示例网站) # ... 更多操作 # 6. 关闭实际代码中需要更优雅的关闭 await harness.close() asyncio.run(main())实操心得在开发初期强烈建议使用有界面的浏览器模式并打开DevTools。你可以在DevTools的Console里手动执行Page.navigate等CDP命令来测试和验证你的Python代码发送的指令是否正确。这是理解和调试CDP交互的黄金方式。4. 赋能AI构建“感知-思考-行动”循环4.1 为AI提供“眼睛”页面内容感知策略要让AI智能体做出决策首先得让它“看到”页面。直接扔给AI完整的HTML源码是低效且浪费token的。我们需要设计智能的感知策略。策略一关键信息提取法此方法适用于目标明确的场景。我们使用Browser Harness的evaluate_script方法在页面上下文中执行JavaScript提取出关键的结构化信息。async def get_page_summary(harness): summary_js (() { const info { url: window.location.href, title: document.title, // 提取所有可见的按钮、链接文本和输入框placeholder interactiveElements: Array.from(document.querySelectorAll(a, button, input, [rolebutton])).map(el ({ tag: el.tagName, text: el.innerText || el.value || el.placeholder || , id: el.id, className: el.className, // 简单的可交互性判断 isVisible: el.offsetWidth 0 el.offsetHeight 0 })).filter(el el.isVisible), // 提取主要文本内容简化版 mainText: document.body.innerText.substring(0, 1500) // 限制长度 }; return JSON.stringify(info); })() result await harness.evaluate_script(summary_js) return json.loads(result[result][value])这样我们就得到了一个包含URL、标题、所有可交互元素列表和主要文本的JSON对象。这个对象体积小、信息密度高非常适合作为上下文发送给AI。策略二屏幕截图OCR法对于高度依赖视觉布局的页面如图形化后台、游戏界面或者元素无法通过常规DOM选择器可靠定位时截图是更好的选择。Browser Harness可以获取页面截图base64格式。你可以将截图保存为文件或者直接使用多模态AI模型如GPT-4V来分析图片。对于开源方案可以结合本地OCR库如Tesseract从截图中提取文字。async def get_screenshot_b64(harness): result await harness.send_command(Page.captureScreenshot, {format: png}) return result[data] # base64编码的图片数据 # 然后可以将base64数据嵌入给AI的提示词中或调用视觉API。策略三混合感知法在实际复杂任务中通常需要混合使用多种感知方式。例如先用关键信息提取法获取大部分文本和元素信息对于其中难以描述的动态区域如图表、验证码再辅以局部截图。这需要在信息丰富度和处理成本之间取得平衡。4.2 设计AI的“大脑”提示词工程与动作规划有了页面感知信息下一步是让AI理解任务并规划动作。这本质上是提示词工程Prompt Engineering。基础提示词模板我们需要设计一个系统提示词System Prompt来定义AI的角色和能力边界。你是一个专业的网页自动化助手。你的目标是根据用户的指令操作浏览器完成任务。 你拥有以下能力 1. 观察OBSERVE你会收到当前页面的摘要信息包括URL、标题、可点击元素列表等。 2. 规划PLAN根据用户目标和当前观察决定下一步做什么。你的行动必须基于当前页面中确实存在的元素。 3. 行动ACT你只能发出以下几种指令 - CLICK [selector]: 点击某个CSS选择器匹配的元素。选择器必须来自观察到的元素列表。 - TYPE [selector] [text]: 在某个输入框内输入文本。 - GOTO [url]: 导航到新网址。 - SCROLL [direction]: 向上/下滚动页面。 - WAIT: 等待页面加载或短暂停顿。 - EXTRACT [selector]: 从指定元素提取文本信息。 - DONE: 任务完成。 当前页面观察 {page_summary_json} 用户目标{user_goal} 请一步一步思考。首先分析当前页面状态与用户目标的差距。然后从可用的行动中选择最合适的一个并严格按照“ACT: 指令内容”的格式回复。不要解释不要输出其他任何内容。在这个模板中{page_summary_json}就是我们上一步获取的页面摘要{user_goal}是用户指令如“搜索关于Python异步编程的最新文章”。动作解析与执行AI会根据提示词回复例如ACT: CLICK #search-button。我们的主控程序需要解析这行输出将其映射到Browser Harness的具体方法。def parse_and_execute_action(harness, ai_response, page_context): lines ai_response.strip().split(\n) for line in lines: if line.startswith(ACT:): action_line line[4:].strip() parts action_line.split( , 2) # 最多分成三部分命令选择器文本 cmd parts[0] if cmd CLICK and len(parts) 1: selector parts[1] element await harness.query_selector(selector) if element: await harness.click(element) else: print(f警告未找到元素 {selector}) elif cmd TYPE and len(parts) 2: selector, text parts[1], parts[2] element await harness.query_selector(selector) if element: await harness.type_text(element, text) # ... 处理其他命令 break # 只执行第一个ACT指令这样我们就完成了一个最简单的“感知-思考-行动”循环获取页面信息 - 发送给AI - 解析AI指令 - 执行 - 获取新页面信息 - 循环。注意事项AI可能会“幻觉”出页面上不存在的元素或提出无法直接执行的复杂动作。因此在解析指令后、执行前必须进行有效性校验。例如检查选择器是否能找到元素检查GOTO的URL格式是否合法。同时在提示词中明确限制AI的行动范围并让它在规划时引用观察到的具体元素属性如点击那个id为‘submit’的按钮能有效减少幻觉。5. 实战演练打造一个智能信息聚合助手让我们通过一个具体案例将上述所有知识串联起来。我们的目标是构建一个智能体它能根据我们给出的关键词自动在多个新闻网站例如一个科技媒体和一个综合新闻门户搜索相关文章并提取标题和链接返回给我们。5.1 任务分解与流程设计这个任务可以分解为以下步骤启动与初始化启动浏览器连接Harness导航到第一个新闻网站如TechNews。站点一操作 a. 在搜索框输入关键词。 b. 点击搜索按钮。 c. 等待结果加载。 d. 从结果页面提取文章列表标题和链接。站点二操作 a. 导航到第二个新闻网站如GeneralNews。 b. 重复步骤2的搜索和提取流程。数据整合与输出将两个站点收集到的信息去重、整理以结构化格式如JSON输出。清理关闭浏览器会话。在这个过程中AI智能体主要负责决策和适应。例如不同网站的搜索框选择器和结果列表结构不同AI需要根据我们提供的页面摘要识别出哪个是搜索框哪个是搜索按钮以及如何定位结果条目。5.2 代码实现与AI协同我们首先编写主控逻辑框架并在关键决策点引入AI。import asyncio import json from browser_harness import BrowserHarness # 假设我们有一个调用大语言模型的函数 call_llm(prompt) async def intelligent_search(harness, keyword, sites): 智能多站点搜索 all_results [] for site_name, site_url in sites.items(): print(f正在处理站点: {site_name}) await harness.goto(site_url) await asyncio.sleep(2) # 等待初始页面加载 # 第一步让AI识别搜索框并输入关键词 page_info await get_page_summary(harness) # 使用之前定义的感知函数 prompt f 当前页面是{site_name}。用户想搜索关键词“{keyword}”。 页面摘要{json.dumps(page_info, ensure_asciiFalse)} 请找出最可能是搜索框的元素并发出输入指令。然后找出搜索按钮发出点击指令。 只回复ACT指令。 ai_instruction await call_llm(prompt) # 执行AI给出的一个或一组ACT指令需扩展parse_and_execute_action以处理序列 await execute_ai_instructions(harness, ai_instruction) # 第二步等待搜索结果加载然后让AI提取信息 await asyncio.sleep(3) # 等待结果加载更佳做法是等待特定元素出现 page_info await get_page_summary(harness) prompt2 f 当前是{site_name}针对“{keyword}”的搜索结果页。 页面摘要{json.dumps(page_info, ensure_asciiFalse)} 请分析页面找出所有新闻文章条目。对于每个条目提取其标题文本和对应的链接href属性。 请以JSON格式回复一个列表每个元素包含title和url字段。 例如[{{title: ..., url: ...}}, ...] ai_extraction await call_llm(prompt2) try: # 尝试解析AI返回的JSON results json.loads(ai_extraction) if isinstance(results, list): all_results.extend(results) print(f从{site_name}提取到{len(results)}条结果。) except json.JSONDecodeError: print(fAI返回格式错误无法解析。原始回复{ai_extraction}) # 去重根据URL seen_urls set() unique_results [] for item in all_results: if item.get(url) and item[url] not in seen_urls: seen_urls.add(item[url]) unique_results.append(item) return unique_results async def main(): harness BrowserHarness(ws://localhost:9222/devtools/browser/...) await harness.connect() # ... 启用必要的CDP域 sites { TechNews: https://technews.example.com, GeneralNews: https://news.portal.com } keyword 人工智能大模型 try: results await intelligent_search(harness, keyword, sites) print(f搜索完成共找到{len(results)}条唯一结果) for res in results: print(f- {res[title]}: {res[url]}) # 可以将results保存为JSON文件 with open(search_results.json, w, encodingutf-8) as f: json.dump(results, f, ensure_asciiFalse, indent2) finally: await harness.close() if __name__ __main__: asyncio.run(main())在这个案例中AI承担了“网页结构理解”和“信息提取规则生成”的重任。我们不需要为每个网站写死不同的CSS选择器AI能根据实时页面摘要进行适配。这大大提升了智能体的泛化能力。5.3 稳定性增强与错误处理在实际运行中网络延迟、页面加载速度、元素动态渲染都会导致脚本失败。我们必须增强鲁棒性。1. 显式等待策略不要依赖固定的sleep时间。应使用基于条件的等待。async def wait_for_element(harness, selector, timeout10): 等待指定元素出现在DOM中 start asyncio.get_event_loop().time() while (asyncio.get_event_loop().time() - start) timeout: element await harness.query_selector(selector) if element: return element await asyncio.sleep(0.5) raise TimeoutError(f元素 {selector} 在{timeout}秒内未出现)可以在AI执行点击等操作前先调用此函数等待目标元素。2. 动作重试机制任何一步操作都可能失败特别是网络交互。为关键操作如click,type_text添加重试逻辑。async def robust_click(harness, selector, retries3): for i in range(retries): try: element await wait_for_element(harness, selector) await harness.click(element) # 点击后可以增加一个检查确认点击产生了预期效果如URL变化、某个元素出现 return True except Exception as e: print(f第{i1}次点击失败: {e}) if i retries - 1: raise await asyncio.sleep(1) return False3. 状态验证与回滚在执行一系列动作后验证是否达到预期状态。如果没有则执行回滚或重置操作。例如在登录后检查是否出现了用户菜单在提交表单后检查是否出现成功提示或错误信息。可以将状态验证也交给AI来判断“根据当前页面摘要判断‘登录’是否成功”4. 异常捕获与日志记录用try...except块包裹主要执行循环记录详细的日志包括时间戳、执行的指令、页面截图这对于调试复杂任务至关重要。6. 避坑指南与进阶优化6.1 常见问题与实战排错即使有了完善的框架在实际部署中你仍会遇到各种问题。以下是一些典型问题及解决方案问题1连接被拒绝或无法找到WebSocket URL。排查首先确认Chrome是否以--remote-debugging-port9222参数启动。然后手动访问http://localhost:9222/json/list看是否能返回JSON数据。如果不行可能是端口被占用或Chrome实例未正常启动调试模式。解决更换端口号或确保启动命令正确。在代码中增加连接重试和更详细的错误信息打印。问题2元素找不到query_selector返回None。排查这是最常见的问题。原因可能包括1) 选择器写错了2) 元素在iframe内3) 元素是动态生成的尚未加载4) 页面结构发生变化。解决调试选择器在浏览器DevTools的Console里用document.querySelector(‘你的选择器’)测试。处理iframe使用CDP的Frame相关命令切换到iframe上下文后再查找。动态等待使用前面提到的wait_for_element函数。容错与自适应让AI尝试多个可能的选择器或使用更宽松的选择器如input[typetext]再通过其他属性如placeholder进行筛选。问题3AI指令执行后页面状态未按预期变化。排查可能是AI的指令不准确或者是页面有异步操作如AJAX提交未完成。解决增强AI观察在提示词中要求AI在规划下一步前先确认上一步的结果例如“如果点击成功页面应该会出现X元素请确认后再继续”。增加状态检查点在关键步骤后主动等待某个标志性元素出现或URL变化。引入超时与轮询对于异步提交在点击提交按钮后循环检查页面某个区域的内容直到出现“成功”或“完成”字样或者超过超时时间。问题4脚本在无头模式下运行正常但有界面时失败。排查有界面模式可能受到屏幕分辨率、缩放比例、窗口聚焦状态的影响导致元素坐标计算或点击事件失效。解决在启动浏览器时固定窗口大小--window-size1920,1080。确保浏览器窗口在前台。可以考虑在脚本开始时模拟一个激活窗口的动作虽然CDP可能没有直接命令但可以通过点击页面body等方式间接实现。优先使用基于DOM的交互如element.click()的JS模拟而非基于坐标的鼠标事件后者对视觉布局更敏感。6.2 性能优化与扩展思路当你的智能体需要处理大量页面或复杂任务时性能成为考量。1. 并行化与多标签页一个Browser Harness实例可以控制多个标签页。你可以并行处理多个独立任务。async def create_new_tab(harness): result await harness.send_command(Target.createTarget, {url: about:blank}) target_id result[targetId] # 然后附加到这个新的目标上获得一个新的会话Session # 这需要管理多个WebSocket连接或会话。更简单的模式是启动多个独立的浏览器进程和Harness实例利用asyncio.gather并行运行。2. 资源复用与连接池频繁启动和关闭浏览器开销很大。可以设计一个浏览器实例池长时间运行供多个自动化任务按需连接和使用。3. 动作链的录制与回放对于固定流程的任务可以先手动操作一遍通过监听CDP事件Network.requestWillBeSent,DOM.nodeInserted等录制下所有动作和对应的页面状态变化生成一个可回放的脚本。这结合了传统录制回放工具的优点但底层更透明、可控。4. 集成更强大的智能体框架将Browser Harness作为“工具”集成到LangChain、AutoGPT或CrewAI等框架中。这些框架提供了更复杂的智能体记忆、任务分解、工具调用管理能力。Browser Harness可以成为其中一个“Selenium Tool”或“Web Navigation Tool”由框架的Orchestrator来调度。5. 安全与伦理考量最后必须强调强大的能力意味着重大的责任。Browser Harness智能体可以模拟人类进行几乎所有网页操作因此必须严格遵守目标网站的服务条款和robots.txt。禁止将其用于暴力破解或撞库攻击。爬取明确禁止爬取的数据。制造虚假流量或点击欺诈。干扰或攻击网站正常服务。 请在合法、合规、合乎道德的范围内使用这项技术并尊重网络资源。