Python浏览器执行

项目目录

项目简介

browser-use 是开源 Python 浏览器 Agent,可读取页面结构与截图,生成点击、输入和提取等动作,再结合执行结果继续决策。支持本地浏览器及远程 CDP 会话;任务结束后可保存运行历史,并附加终局评估。

如何写进简历

询采 · 供应商报价采集助手 | 场景化示例

项目描述:基于 browser-use,供采购人员读取供应商报价网页与附件,汇总规格、价格、起订量和交期,保留来源供人工比价。

技术栈:Python、Chromium、CDP、Pydantic

主要工作:

  • 页面观察与采集闭环:基于 browser-use 的页面观察与动作反馈,结合 DOM 索引、按需提供的截图和前序执行结果,驱动报价页筛选、翻页与附件下载,并按下一轮页面状态继续采集。
  • 跨页动作中断:利用动作批次中断标记及 URL、焦点页面变化检测,停止当前批次的剩余动作,重新观察后继续规划,降低跨页沿用失效元素索引的风险。
  • 结构化报价与结果验收:利用 Pydantic 约束规格、报价单位和交期等输出字段,关联来源页面与附件,并按原始报价核验采集结果,形成可回查的比价输入。

面试题与回答

  1. GUI Agent 或 Browser Use 在项目中如何部署?

    展开收起

    核心回答

    browser-use 的开源 Python 库可以启动本地浏览器,也可以连接已有的 CDP 浏览器;云浏览器是另一种需要相应配置的运行方式。项目中先选择浏览器运行位置,再配置会话数据、Agent 的模型和任务限制。业务队列、用户权限及任务持久状态需要由接入方组织,不能从库的使用示例推导它们已经存在。

    本地、远程与会话配置怎样选择?

    固定版本中,BrowserSession 未配置 cdp_url 且未启用 use_cloud 时走本地浏览器路径;提供 CDP 地址可连接远程浏览器,启用云路径则需要对应凭据。这里区分的是浏览器在哪里运行,模型调用仍由 Agent 的模型配置决定。浏览器运行分支。

    BrowserProfile 支持 user_data_dir、storage_state 和无头模式。并发任务应显式规划会话目录,避免复用同一持久目录造成锁冲突或登录态混用;同时配置目录和存储状态时,还要理解后者导入会覆盖相关存储。它不是自动替接入方分配租户隔离空间。会话配置兼容检查。

    域名限制和超时能保证什么?

    配置 allowed_domains 等规则后,安全监听器检查导航请求、完成导航和新标签页;发现不允许的导航会拒绝,跳转后也可能导航到空白页或关闭新标签。这是导航层控制,并不是拦截所有网页资源、脚本请求和数据外传的网络防火墙,默认也没有替业务配置一份域名白名单。导航策略。

    Agent 步骤与工具动作有不同的超时配置。动作超时会形成错误结果,供下一步决定如何处理;它不能撤销可能已经发生的浏览器操作。部署后仍要按实际站点验证登录失效、页面跳转、长下载和提交结果不确定等场景。动作执行与错误返回。

    怎样保存记录并结束运行?

    可以显式调用 save_history() 导出执行历史。保存历史便于复查动作和结果,但不等于系统拥有持久任务队列,也不能据此承诺进程退出后从任意动作中间恢复;敏感数据过滤还取决于实际提供的配置,不能认定所有截图和日志都已完成脱敏。历史导出。

    Agent.close() 默认调用浏览器会话清理;配置 keep_alive 时保留会话并停止相关事件处理。持续复用会话需要接入方管理其生命周期,不能让已完成任务无限占用浏览器。服务化时应将历史、下载产物和业务验收结果按任务标识保存,再释放相应资源。运行清理。

  2. 为什么 GUI Agent 离线动作准确率高,闭环任务成功率仍可能很低?

    展开收起

    核心回答

    browser-use 用 Python 将浏览器状态、模型决策和工具执行组成循环:每轮读取页面截图、DOM 等状态,结合前一轮动作结果生成下一步,再执行动作并把结果送回后续观察。模型选对一个元素,并不代表整批动作仍然适用于执行后的页面,更不代表任务已经完成。

    以一次报价采集为例,模型根据当前页面规划“输入产品型号、筛选、打开报价详情”;筛选或打开详情可能导致导航或切换活动页面,原页面中的元素索引随之不再适用。此时应先确认目标供应商和产品规格,再决定下一步。

    动作批次为什么要提前停止

    multi_act() 支持一轮模型输出多个动作,但会在两类情况下停止剩余队列:

    • 动作声明会改变页面。 导航、返回、切换页面等动作标有 terminates_sequence=True,执行后不再继续这一批后续动作。
    • 执行后发现页面上下文改变。 比较动作前后的 URL 和 agent_focus_target_id;URL 或活动页面目标改变,就停止剩余动作。这里的焦点指浏览器活动页面目标,不是某个输入框获得键盘焦点。

    此外,动作返回错误、任务结束或出现执行异常,也会结束当前批次;此前已经得到的部分结果会保留。具体机制见批次执行与页面变化保护。

    停止批次意味着剩余动作没有执行。进入后续步骤时,Agent 根据新状态与已有结果重新决策,代码没有承诺把被截断的整批动作原样自动重试。当前实现也没有“页面新增任意元素就停止批次”的判断;新元素的 is_new 标记用于后续页面描述,不能替代批次中的变化检测。

    因此,弹窗或局部重绘即使没有改变 URL、活动页面目标,也可能使后续动作依据过期。批量动作减少模型往返,但会扩大两次观察之间的状态变化窗口;需要按任务中页面变化的频率选择动作批次,而非只追求一次生成更多操作。

    错误反馈能帮助继续,不能保证恢复成功

    每轮 step() 先准备浏览器状态和前步结果,再请求模型、执行动作和后处理。工具超时或异常会转成 ActionResult,供后续决策使用;普通动作异常会保留先前部分结果,连接异常则交给外层处理。循环仍受步数、超时和失败条件约束,不会无限尝试。见观察与执行循环。

    工具结果还需要按含义判断。例如点击索引已失效时,工具会返回“页面可能已经改变,请刷新状态”的内容提示,并不总是设置 error。因此不能用“没有异常”统计所有点击成功;更应该核对所需页面状态是否发生变化。超时也不保证前一个动作没有产生任何副作用,决定重试前还需观察结果。

    完成声明怎样与真实结果核对

    当前默认启用的 judge 会查看任务、轨迹和截图,把评判附到结果中;它不会覆盖 Agent 自报的 success。发现 done 后,执行循环运行 judge 并结束,并没有“judge 判失败就自动重做”的分支。见完成后的 judge 调用与评判结果的作用。

    评测时应分别保存 Agent 自报、judge 判断和业务验收结果。例如确认报价页中的目标产品、价格字段、币种与附件内容,而不是看到“点击成功”或 done 就计为任务成功。对同一组任务再比较动作批次、等待策略和错误恢复后的成功率,才能判断问题主要在模型定位能力,还是执行循环与结果确认。

  3. Agent 如何验证工具确实执行成功,避免产生任务完成幻觉?

    展开收起

    browser-use 是用 Python 驱动的浏览器 Agent:模型结合页面状态选择点击、输入、提取等动作,工具层执行,再把结果交给后续决策。以 0.13.13 的供应商报价采集场景说明,它提供执行反馈与模型复核机制,报价字段及附件的最终验收还需要接入具体规则。

    上轮动作结果与新页面一起判断

    step() 先调用 _prepare_context() 获取浏览器状态及截图,把上轮模型输出、ActionResult 和当前页面组织成消息,再请求模型并执行动作。_execute_actions() 保存本轮结果,供后续步骤使用。这样模型可以检查筛选后是否出现目标报价、页面是否仍显示报错,而不是只根据自己计划过的动作推断成功。观察与结果回填。

    工具层把执行超时、浏览器错误或其他异常转成相应结果,让模型决定恢复方式。不过,没有 error 不等于动作达成目标:例如元素索引已失效时,点击工具会在 extracted_content 中提示重新获取页面状态。因此还要读取返回内容并检查实际页面变化。工具执行与异常、元素不存在的返回。

    done、结构化输出和 Judge 各自说明什么

    done 把模型给出的 success 和最终文本写入 ActionResult,并设置 is_done=True。所以 history.is_done() 表示已经发出结束动作,history.is_successful() 读取模型自报的成功状态,history.final_result() 返回最后的输出内容。配置 output_model_schema 可以约束结构化结果的格式,不能据此证明其中的报价内容或附件真实存在。完成动作、历史结果方法。

    该版本默认启用 use_judge=True。结束后,Judge 根据任务、最终输出、执行轨迹和截图再次评估,可通过 ground_truth 提供验收条件;未指定 judge_llm 时使用主模型。它是另一次模型评估,仍受可见证据和模型判断能力限制。Judge 输入、默认配置。

    Judge 的结论只附加为 judgement,不会覆盖模型自报的 success,判失败也不会自动重新执行任务。 Judge 调用异常时返回 None;调用方可以分别读取 is_successful() 与 is_validated(),不能把“模型称成功、Judge 未返回”当作验证通过。终局评估及异常路径、结束处理。

    报价采集怎样补上业务验收

    业务集成可以增加报价验收步骤:按供应商、产品规格和采集时间保存报价字段与来源地址,确认币种、含税口径、起订量及交期能在网页或附件中定位;下载后再检查文件存在、能解析且对应目标产品。Agent 的完成文本、Judge 结果与这些检查分别保存,最终完成状态由业务验收条件决定。

    例如“已打开报价页但没有目标规格”“附件下载完成但已过报价有效期”“模型自报成功而 Judge 判失败”都应保留各自状态。等待超时先检查当前页面与已有附件,再决定是否重新读取或下载。这些是可增加的验收设计,不能仅凭上游浏览器循环就推定已经实现。