Skip to main content
Playwright 是由 Microsoft 开发的开源自动化工具,允许您以编程方式控制和自动化网络浏览器。它专为端到端测试、抓取以及跨各种网络浏览器(如 ChromiumFirefoxWebKit)的自动化任务而设计。
此工具包用于与浏览器交互。虽然其他工具(如 Requests 工具)适用于静态网站,但 PlayWright Browser 工具包让您的代理能够浏览网络并与动态渲染的网站交互。 PlayWright Browser 工具包中捆绑的一些工具包括:
  • NavigateTool (navigate_browser) - 导航到 URL
  • NavigateBackTool (previous_page) - 等待元素出现
  • ClickTool (click_element) - 点击元素(由选择器指定)
  • ExtractTextTool (extract_text) - 使用 beautiful soup 从当前网页提取文本
  • ExtractHyperlinksTool (extract_hyperlinks) - 使用 beautiful soup 从当前网页提取超链接
  • GetElementsTool (get_elements) - 按 CSS 选择器选择元素
  • CurrentPageTool (current_page) - 获取当前页面 URL
pip install -qU  playwright > /dev/null
pip install -qU  lxml

# 如果这是您第一次使用 playwright,您需要安装浏览器可执行文件。
# 默认情况下,运行 `playwright install` 会安装 chromium 浏览器可执行文件。
# playwright install
from langchain_community.agent_toolkits import PlayWrightBrowserToolkit
异步函数以创建上下文并启动浏览器:
from langchain_community.tools.playwright.utils import (
    create_async_playwright_browser,  # 提供同步浏览器,但与 jupyter 不兼容。\n",   },
)
# 此导入仅适用于 jupyter notebooks,因为它们有自己的事件循环
import nest_asyncio

nest_asyncio.apply()

实例化浏览器工具包

始终建议使用 from_browser 方法实例化,以便正确初始化和管理浏览器上下文,确保无缝交互和资源优化。
async_browser = create_async_playwright_browser()
toolkit = PlayWrightBrowserToolkit.from_browser(async_browser=async_browser)
tools = toolkit.get_tools()
tools
[ClickTool(async_browser=<Browser type=<BrowserType name=chromium executable_path=/Users/isaachershenson/Library/Caches/ms-playwright/chromium-1124/chrome-mac/Chromium.app/Contents/MacOS/Chromium> version=127.0.6533.17>),
 NavigateTool(async_browser=<Browser type=<BrowserType name=chromium executable_path=/Users/isaachershenson/Library/Caches/ms-playwright/chromium-1124/chrome-mac/Chromium.app/Contents/MacOS/Chromium> version=127.0.6533.17>),
 NavigateBackTool(async_browser=<Browser type=<BrowserType name=chromium executable_path=/Users/isaachershenson/Library/Caches/ms-playwright/chromium-1124/chrome-mac/Chromium.app/Contents/MacOS/Chromium> version=127.0.6533.17>),
 ExtractTextTool(async_browser=<Browser type=<BrowserType name=chromium executable_path=/Users/isaachershenson/Library/Caches/ms-playwright/chromium-1124/chrome-mac/Chromium.app/Contents/MacOS/Chromium> version=127.0.6533.17>),
 ExtractHyperlinksTool(async_browser=<Browser type=<BrowserType name=chromium executable_path=/Users/isaachershenson/Library/Caches/ms-playwright/chromium-1124/chrome-mac/Chromium.app/Contents/MacOS/Chromium> version=127.0.6533.17>),
 GetElementsTool(async_browser=<Browser type=<BrowserType name=chromium executable_path=/Users/isaachershenson/Library/Caches/ms-playwright/chromium-1124/chrome-mac/Chromium.app/Contents/MacOS/Chromium> version=127.0.6533.17>),
 CurrentWebPageTool(async_browser=<Browser type=<BrowserType name=chromium executable_path=/Users/isaachershenson/Library/Caches/ms-playwright/chromium-1124/chrome-mac/Chromium.app/Contents/MacOS/Chromium> version=127.0.6533.17>)]
tools_by_name = {tool.name: tool for tool in tools}
navigate_tool = tools_by_name["navigate_browser"]
get_elements_tool = tools_by_name["get_elements"]
await navigate_tool.arun(
    {"url": "https://web.archive.org/web/20230428133211/https://cnn.com/world"}
)
'导航到 https://web.archive.org/web/20230428133211/https://cnn.com/world 返回状态码 200'
# 浏览器在工具之间共享,因此代理可以以有状态的方式交互
await get_elements_tool.arun(
    {"selector": ".container__headline", "attributes": ["innerText"]}
)
'[{"innerText": "这些乌克兰兽医冒着生命危险在战区照顾狗和猫"}, {"innerText": "海洋“暮光区”的生命可能因气候危机而消失"}, {"innerText": "西达尔富尔冲突重燃,苏丹暴力中食物和水短缺加剧"}, {"innerText": "泰国警察妻子因涉嫌谋杀和十余起其他中毒案件接受调查"}, {"innerText": "美国教师乘法国撤离飞机逃离苏丹,回国后未获帮助"}, {"innerText": "迪拜新兴嘻哈场景正在找到自己的声音"}, {"innerText": "一部水下电影如何启发了肯尼亚海岸外的海洋保护区"}, {"innerText": "研究显示,俄罗斯在乌克兰部署的伊朗无人机由被盗的西方技术提供动力"}, {"innerText": "印度称边境侵犯侵蚀了与中国的“全部关系基础”"}, {"innerText": "澳大利亚警方筛选 3000 吨垃圾以寻找失踪女子的遗骸"}, {"innerText": "随着美国和菲律宾防务关系的发展,中国就台湾紧张局势发出警告"}, {"innerText": "唐·麦克林与韩国总统二重唱,后者曾向拜登演唱《American Pie》"}, {"innerText": "研究发现,亚洲近三分之二的大象栖息地丧失"}, {"innerText": "“我们不睡觉……我会称之为昏厥”:在苏丹危机中担任医生"}, {"innerText": "肯尼亚逮捕第二名牧师,面临与“大规模杀害其追随者”相关的刑事指控"}, {"innerText": "俄罗斯对乌克兰发动致命的多波次袭击"}, {"innerText": "女子被迫离开永远的家,否则“步行走向死亡”"}, {"innerText": "美国众议院议长凯文·麦卡锡就迪士尼-德桑蒂斯争端表态"}, {"innerText": "双方同意延长苏丹停火"}, {"innerText": "西班牙“豹 2”坦克正在运往乌克兰,国防部长证实"}, {"innerText": "据信,火焰披萨引发了马德里致命的餐厅火灾"}, {"innerText": "俄罗斯意外袭击该市数日后,别尔哥罗德又发现一枚炸弹"}, {"innerText": "一名黑人少年被杀引发英国警务种族主义危机。三十年后,情况几乎没有改变"}, {"innerText": "比利时销毁一批美国啤酒,因不满“啤酒中的香槟”标语"}, {"innerText": "英国首相里希·苏纳克因顶级盟友拉布因欺凌指控辞职而受到震动"}, {"innerText": "伊朗海军扣押悬挂马绍尔群岛旗帜的船只"}, {"innerText": "分裂的以色列在其 75 岁生日之际处于危险的十字路口"}, {"innerText": "巴勒斯坦记者打破障碍,在以色列电视台用希伯来语报道"}, {"innerText": "五分之一的水污染来自纺织染料。但受贝类启发的解决方案可以清理它"}, {"innerText": "“人们为区区 10 美元牺牲了生命”:也门人群激增造成至少 78 人死亡"}, {"innerText": "以色列警方称,两名男子在耶路撒冷犹太墓附近遭枪击,疑似“恐怖袭击”"}, {"innerText": "查尔斯三世国王加冕典礼:谁将在仪式上表演"}, {"innerText": "一周 33 张照片"}, {"innerText": "香港濒危海龟"}, {"innerText": "图片:英国卡米拉王后"}, {"innerText": "分析发现,使数百万人陷入危机的灾难性干旱因气候变化而发生的可能性增加了 100 倍"}, {"innerText": "多年来,一家英国矿业巨头在赞比亚因污染问题而无人能动,直到一名前矿工的儿子与之对抗"}, {"innerText": "前苏丹部长艾哈迈德·哈伦因战争罪指控被通缉,从喀土穆监狱获释"}, {"innerText": "世卫组织警告“生物风险”,苏丹武装分子夺取实验室,暴力破坏美斡旋停火"}, {"innerText": "哥伦比亚的佩特罗,一名前左翼游击队员,如何在华盛顿找到突破口"}, {"innerText": "博索纳罗的律师称,他意外创建了质疑巴西选举结果的 Facebook 帖子"}, {"innerText": "海地人群杀死十余名疑似帮派成员"}, {"innerText": "查获数千瓶含有液态甲基苯丙胺的龙舌兰酒"}, {"innerText": "为何向韩国派遣美国隐形潜艇——并告知全世界?"}, {"innerText": "福岛渔业在核灾难中幸存。12 年后,它担心东京的下一步行动可能使其终结"}, {"innerText": "新加坡处决一名贩运两磅大麻的男子"}, {"innerText": "泰国保守党希望通过承诺将性玩具合法化来吸引选民"}, {"innerText": "意大利村庄内部正被美国人重新定居"}, {"innerText": "罢工、飙升的机票价格和波动的酒店费用:加冕典礼旅行者指南"}, {"innerText": "阿塞拜疆的一年:从春季大奖赛到冬季滑雪冒险"}, {"innerText": "开普敦的自行车市长推动两轮革命"}, {"innerText": "东京拉面店禁止顾客在用餐时使用手机"}, {"innerText": "南非歌剧明星将在查尔斯三世国王加冕典礼上表演"}, {"innerText": "奢侈品战利品上拍:法国拍卖从毒贩手中缴获的物品"}, {"innerText": "朱迪·布鲁姆的书籍对几代读者产生了深远影响。以下是它们经久不衰的原因"}, {"innerText": "工艺、回收利用和可持续性成为米兰设计周的中心舞台"}, {"innerText": "为庆祝加冕典礼,揭幕真人大小的查尔斯三世巧克力雕塑"}, {"innerText": "严重风暴将再次袭击南部,德克萨斯州数百万人可能遭遇破坏性大风和冰雹"}, {"innerText": "南部再次成为恶劣天气的目标,持续多日的强冰雹和龙卷风威胁仍在"}, {"innerText": "春季融雪使密西西比河沿岸城市为家庭和企业洪水做好准备"}, {"innerText": "了解龙卷风监视、龙卷风警告和龙卷风紧急情况之间的区别"}, {"innerText": "记者发现熟悉面孔报道苏丹撤离。看看接下来发生了什么"}, {"innerText": "这个国家将很快成为世界上人口最多的国家"}, {"innerText": "2023 年 4 月 27 日 - 俄罗斯-乌克兰新闻"}, {"innerText": "“他们经常互相射击”:乌克兰无人机操作员详述俄罗斯军队的混乱"}, {"innerText": "听取困在苏丹的美国家庭成员对美国回应的沮丧"}, {"innerText": "美国脱口秀主持人杰瑞·斯普林格去世,享年 79 岁"}, {"innerText": "官僚作风至少延误了一个家庭从苏丹撤离"}, {"innerText": "女孩将获得罕见免疫疾病的救命治疗"}, {"innerText": "海地犯罪率一年内翻倍多"}, {"innerText": "海洋普查旨在发现 10 万种以前未知的海洋物种"}, {"innerText": "《华尔街日报》编辑讨论记者莫斯科被捕事件"}, {"innerText": "突尼斯的民主能得救吗?"}, {"innerText": "亚斯明·拉里,从“明星建筑师”转变为社会工程师,赢得建筑界最令人垂涎的奖项之一"}, {"innerText": "一座大规模、新修复的弗兰克·劳埃德·赖特豪宅待售"}, {"innerText": "这些是世界上最可持续的建筑项目吗?"}, {"innerText": "走进伦敦一座价值 7200 万美元的联排别墅,它由军营改建而成"}, {"innerText": "一家 3D 打印公司正准备在月球表面建造。但首先,是在国内进行登月尝试"}, {"innerText": "西蒙娜·哈勒普表示“压力巨大”,她在药检阳性后努力重返网坛"}, {"innerText": "巴塞罗那与切尔西战平,连续第三次晋级女足欧冠决赛"}, {"innerText": "雷克瑟姆:一个关于好莱坞魅力和体育浪漫的迷人故事"}, {"innerText": "大谷翔平在天使队获胜中险些创造更多 MLB 历史"}, {"innerText": "这位 CNN 英雄正在招募休闲潜水员,帮助佛罗里达州一个珊瑚一个珊瑚地重建珊瑚礁"}, {"innerText": "这位 CNN 英雄为无家可归者的宠物提供无评判的兽医护理"}, {"innerText": "不要放弃里程碑:CNN 英雄在自闭症意识月传达的信息"}, {"innerText": "年度 CNN 英雄内莉·切博伊返回肯尼亚,计划让更多学生摆脱贫困"}]'
# 如果代理想记住当前网页,可以使用 `current_webpage` 工具
await tools_by_name["current_webpage"].arun({})
'https://web.archive.org/web/20230428133211/https://cnn.com/world'

在代理中使用

一些浏览器工具是 StructuredTool,这意味着它们期望多个参数。这些工具与早于 STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION 的代理不兼容(开箱即用)。
from langchain_anthropic import ChatAnthropic
from langchain.agents import create_agent


model = ChatAnthropic(
    model_name="claude-haiku-4-5-20251001", temperature=0
)  # 或任何其他 LLM,例如 ChatOpenAI(), OpenAI()

agent_chain = create_agent(model=model, tools=tools)
result = await agent_chain.ainvoke(
    {"messages": [("user", "What are the headers on langchain.com?")]}
)
print(result)
> 进入新的 AgentExecutor 链...
思考:要查找 langchain.com 上的标题,我将导航到网站并提取文本。

操作:
\`\`\`
{
  "action": "navigate_browser",
  "action_input": "https://langchain.com"
}
\`\`\`


观察:导航到 https://langchain.com 返回状态代码 200
思考:好的,让我们在 langchain.com 网站上查找标题。

操作:
\`\`\`
{
  "action": "extract_text",
  "action_input": {}
}
\`\`\`


观察:LangChain 我们重视您的隐私 我们使用 cookie 来分析我们的流量。点击“接受全部”,即表示您同意我们使用 cookie。隐私政策 自定义 拒绝全部 接受全部 自定义同意偏好 我们可能会使用 cookie 来帮助您高效导航并执行某些功能。您将在下面的每个同意类别下找到所有 cookie 的详细信息。归类为“必要”的 cookie 存储在您的浏览器中,因为它们对于启用网站的基本功能至关重要。... 显示更多 必要 始终启用 必要 cookie 是启用本网站基本功能所必需的,例如提供安全登录或调整您的同意偏好。这些 cookie 不会存储任何个人可识别数据。功能性 功能性 cookie 有助于执行某些功能,例如在社交媒体平台上共享网站内容、收集反馈和其他第三方功能。分析 分析性 cookie 用于了解访问者如何与网站互动。这些 cookie 有助于提供有关指标的信息,例如访问者数量、跳出率、流量来源等。性能 性能 cookie 用于了解和分析网站的关键性能指标,从而为访问者提供更好的用户体验。广告 广告 cookie 用于根据您之前访问的页面向访问者提供定制广告,并分析广告活动的效果。未分类 其他未分类 cookie 是那些正在分析中且尚未归类的 cookie。拒绝全部 保存我的偏好 接受全部 产品 LangChain LangSmith LangGraph 方法 检索 代理 评估 资源 博客 案例研究 用例灵感 专家 更新日志 文档 LangChain 文档 LangSmith 文档 公司 关于 职业 定价 获取演示 注册 LangChain 的产品套件支持开发人员完成 LLM 应用程序生命周期的每一步。能够推理的应用程序。由 LangChain 提供支持。获取演示 免费注册 从初创公司到全球企业,雄心勃勃的构建者都选择 LangChain 产品。构建 LangChain 是一个通过链接可互操作组件来使用 LLM 构建的框架。LangGraph 是用于构建可控代理工作流的框架。运行 使用 LangGraph Cloud 部署您的 LLM 应用程序,这是我们专为代理构建的基础设施。管理 在 LangSmith 中调试、协作、测试和监控您的 LLM 应用程序 - 无论它是使用 LangChain 框架构建的还是其他方式。使用 LangChain 构建您的应用程序 使用 LangChain 的灵活框架构建上下文感知、推理应用程序,利用您公司的数据和 API。通过将供应商可选性作为 LLM 基础设施设计的一部分,使您的应用程序面向未来。了解更多关于 LangChain 的信息 使用 LangGraph Cloud 大规模运行 使用 LangGraph Cloud 部署您的 LangGraph 应用程序,实现容错可扩展性 - 包括对异步后台作业、内置持久性和分布式任务队列的支持。了解更多关于 LangGraph 的信息 使用 LangSmith 管理 LLM 性能 使用 LangSmith 的调试、测试、部署和监控工作流更快地交付。不要依赖“感觉”——为您的 LLM 开发工作流增加工程严谨性,无论您是否使用 LangChain 构建。了解更多关于 LangSmith 的信息 听取我们满意客户的反馈 LangChain、LangGraph 和 LangSmith 帮助各种规模、各个行业的团队 - 从雄心勃勃的初创公司到成熟的企业。“LangSmith 帮助我们提高了 Retool 微调模型的准确性和性能。通过与 LangSmith 迭代,我们不仅交付了更好的产品,而且以一小部分时间向用户交付了新的 AI 功能。” Jamie Cuffe 自助服务和新产品主管“通过结合 LangSmith 的优势并站在庞大的开源社区的肩膀上,我们能够更快地确定在企业环境中使用 LLM 的正确方法。” Yusuke Kaji AI 总经理“与 LangChain 和 LangSmith 在 Elastic AI 助手上的合作对整体开发和交付体验的速度和质量产生了显著的积极影响。没有 LangChain,我们无法实现交付给客户的产品体验,而没有 LangSmith,我们也无法以同样的速度完成。” James Spiteri 安全产品总监“我们一听说 LangSmith,就将整个开发堆栈迁移到了它上面。我们本可以在内部构建评估、测试和监控工具,但使用 LangSmith,我们花费的时间减少了 10 倍,却获得了 1000 倍更好的工具。” Jose Peña 高级经理 企业采用的参考架构以实现成功。LangChain 的产品套件可以独立使用或堆叠在一起以产生倍增效果 - 指导您完成构建、运行和管理 LLM 应用程序的过程。每月下载量 1500 万+ 应用程序支持 100K+ GitHub Stars 75K+ 贡献者 3K+ 最大的 GenAI 开发者社区 与推动行业发展的 100 多万开发者一起学习。探索 LangChain 今天开始使用 LangSmith 获取演示 免费注册 使用 LangChain 构建的团队正在推动运营效率,提高发现和个性化,并交付产生收入的优质产品。发现用例 从已经做到的公司中获得灵感。金融服务 金融科技 技术 LangSmith 是专为 LLM 构建的企业 DevOps 平台。探索 LangSmith 获得可见性,以在成本、延迟和质量之间做出权衡。提高开发者生产力。消除手动、容易出错的测试。减少幻觉并提高可靠性。企业部署选项以确保数据安全。准备好更快地交付可靠的 GenAI 应用程序了吗?开始使用 LangChain、LangGraph 和 LangSmith 来增强您的 LLM 应用程序开发,从原型到生产。获取演示 免费注册 产品 LangChain LangSmith LangGraph 代理 评估 检索 资源 Python 文档 JS/TS 文档 GitHub 集成 模板 更新日志 LangSmith 信任门户 公司 关于 博客 Twitter LinkedIn YouTube 社区 营销资产 订阅我们的时事通讯以保持最新状态 谢谢!您的提交已收到!哎呀!提交表单时出错。所有系统运行正常 隐私政策 服务条款
思考:根据从 langchain.com 网站提取的文本,我可以看到的主要标题是:

- LangChain
- 产品
  - LangChain
  - LangSmith
  - LangGraph
- 方法
  - 检索
  - 代理
  - 评估
- 资源
  - 博客
  - 案例研究
  - 用例灵感
  - 专家
  - 更新日志
- 文档
  - LangChain 文档
  - LangSmith 文档
- 公司
  - 关于
  - 职业
  - 定价
- 获取演示
- 注册

该网站似乎围绕其主要产品(LangChain、LangSmith、LangGraph)以及资源和文档进行组织。

操作:
\`\`\`
{
  "action": "Final Answer",
  "action_input": "langchain.com 网站上的主要标题是:\n\n- LangChain\n- 产品\n  - LangChain\n  - LangSmith\n  - LangGraph\n- 方法\n  - 检索\n  - 代理\n  - 评估\n- 资源\n  - 博客\n  - 案例研究\n  - 用例灵感\n  - 专家\n  - 更新日志\n- 文档\n  - LangChain 文档\n  - LangSmith 文档\n- 公司\n  - 关于\n  - 职业\n  - 定价\n- 获取演示\n- 注册"
}
\`\`\`

> 链结束。
langchain.com 网站上的主要标题是:

- LangChain
- 产品
  - LangChain
  - LangSmith
  - LangGraph
- 方法
  - 检索
  - 代理
  - 评估
- 资源
  - 博客
  - 案例研究
  - 用例灵感
  - 专家
  - 更新日志
- 文档
  - LangChain 文档
  - LangSmith 文档
- 公司
  - 关于
  - 职业
  - 定价
- 获取演示
- 注册