浏览器工具

adk-browser crate 提供了 46 种全面的浏览器自动化工具,使 AI 代理能够与网页交互。它基于 WebDriver 协议 (Selenium) 构建,适用于任何 WebDriver 兼容的浏览器。

概述

浏览器工具允许代理执行以下操作:

  • 导航网页并管理浏览器历史记录
  • 提取文本、链接、图像和结构化数据
  • 填写表单并与页面元素交互
  • 截取屏幕截图并生成 PDFs
  • 执行 JavaScript 以实现高级自动化
  • 管理 cookie、框架和多个窗口

快速开始

添加到您的 Cargo.toml

[dependencies]
adk-browser = "2.0.0"
adk-agent = "2.0.0"
adk-model = "2.0.0"

先决条件

启动 WebDriver 服务器:

# Using Docker (recommended)
docker run -d -p 4444:4444 -p 7900:7900 --shm-size=2g selenium/standalone-chrome:latest

# Or use ChromeDriver directly
chromedriver --port=4444

基本用法

use adk_browser::{BrowserSession, BrowserToolset, BrowserConfig};
use adk_agent::LlmAgentBuilder;
use adk_model::GeminiModel;
use std::sync::Arc;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Configure browser session
    let config = BrowserConfig::new()
        .webdriver_url("http://localhost:4444")
        .headless(true)
        .viewport(1920, 1080);

    // Create and start browser session
    let browser = Arc::new(BrowserSession::new(config));
    browser.start().await?;

    // Create toolset with all 46 tools
    let toolset = BrowserToolset::new(browser.clone());
    let tools = toolset.all_tools();

    // Create AI agent with browser tools
    let api_key = std::env::var("GOOGLE_API_KEY")?;
    let model = Arc::new(GeminiModel::new(&api_key, "gemini-2.5-flash")?);

    let mut builder = LlmAgentBuilder::new("web_agent")
        .model(model)
        .instruction("You are a web automation assistant. Use browser tools to help users.");

    for tool in tools {
        builder = builder.tool(tool);
    }

    let agent = builder.build()?;

    // Clean up when done
    browser.stop().await?;

    Ok(())
}

过滤工具

仅选择您的代理所需的工具:

let toolset = BrowserToolset::new(browser)
    .with_navigation(true)   // navigate, back, forward, refresh
    .with_extraction(true)   // extract_text, extract_attribute, extract_links, page_info, page_source
    .with_interaction(true)  // click, double_click, type, clear, select
    .with_wait(true)         // wait_for_element, wait, wait_for_page_load, wait_for_text
    .with_screenshot(true)   // screenshot
    .with_js(true)           // evaluate_js, scroll, hover, handle_alert
    .with_cookies(false)     // Disable cookie tools
    .with_frames(false)      // Disable frame tools
    .with_windows(false)     // Disable window tools
    .with_actions(false);    // Disable advanced actions

let tools = toolset.all_tools();

使用池支持的工具集进行多租户使用

对于生产环境的多租户部署,请使用 BrowserToolset::with_pool() 结合 LlmAgentBuilder::toolset()。每个用户在运行时从池中获取一个隔离的浏览器会话:

use adk_browser::{BrowserSessionPool, BrowserToolset, BrowserConfig, BrowserProfile};
use adk_agent::LlmAgentBuilder;
use std::sync::Arc;

let pool = Arc::new(BrowserSessionPool::new(BrowserConfig::new(), 10));

// Pool-backed toolset — sessions resolved per-user via ctx.user_id()
let toolset = Arc::new(BrowserToolset::with_pool_and_profile(
    pool,
    BrowserProfile::Scraping,
));

let agent = LlmAgentBuilder::new("web_agent")
    .model(model)
    .instruction("You are a web research assistant.")
    .toolset(toolset)
    .build()?;

浏览器会话会自动启动并从陈旧的 WebDriver 连接中自动恢复。您不再需要在使用工具之前调用 browser.start() — 会话会在首次使用时透明地启动。

可用工具(共 46 个)

工具描述
browser_navigate导航到 URL
browser_back返回历史记录
browser_forward前进到历史记录
browser_refresh刷新当前页面

提取 (5 个工具)

工具描述
browser_extract_text从元素中提取可见文本
browser_extract_attribute从元素获取属性值
browser_extract_links提取页面上的所有链接
browser_page_info获取当前 URL 和标题
browser_page_source获取 HTML 源

交互 (5 个工具)

工具描述
browser_click点击一个元素
browser_double_click双击一个元素
browser_type在元素中输入文本
browser_clear清除输入字段
browser_select选择下拉选项

等待 (4 个工具)

工具描述
browser_wait_for_element等待元素出现
browser_wait等待一段时间
browser_wait_for_page_load等待页面加载
browser_wait_for_text等待文本出现

截图 (1 tool)

工具描述
browser_screenshot捕获页面或元素屏幕截图

JavaScript (4 个工具)

工具描述
browser_evaluate_js执行 JavaScript 代码
browser_scroll滚动页面
browser_hover将鼠标悬停在元素上
browser_handle_alert处理 JavaScript 警报

Cookie (5 tools)

工具描述
browser_get_cookies获取所有 cookie
browser_get_cookie获取特定 cookie
browser_add_cookie添加一个 cookie
browser_delete_cookie删除一个 cookie
browser_delete_all_cookies删除所有 cookie

窗口/标签页 (8 个工具)

工具描述
browser_list_windows列出所有窗口/标签页
browser_new_tab在新标签页中打开
browser_new_window在新窗口中打开
browser_switch_window切换到窗口
browser_close_window关闭当前窗口
browser_maximize_window最大化窗口
browser_minimize_window最小化窗口
browser_set_window_size设置窗口大小

框架 (3 tools)

工具描述
browser_switch_to_frame切换到 iframe
browser_switch_to_parent_frame切换到父框架
browser_switch_to_default_content切换到主文档

操作 (7 个工具)

工具描述
browser_drag_and_drop拖放元素
browser_right_click右键点击元素
browser_focus聚焦元素
browser_element_state获取元素状态(可见、启用、选中)
browser_press_key按下键盘键
browser_file_upload上传文件到输入
browser_print_to_pdf从页面生成 PDF

元素选择器

针对元素的工具接受 CSS selectors:

// By ID
"#login-button"

// By class
".submit-btn"

// By tag and attribute
"input[type='email']"

// By data attribute
"[data-testid='search']"

// Complex selectors
"form.login input[name='password']"

// Nth child
"ul.menu li:nth-child(3)"

示例:Web 研究 Agent

use adk_browser::{BrowserSession, BrowserToolset, BrowserConfig};
use adk_agent::LlmAgentBuilder;
use std::sync::Arc;

let config = BrowserConfig::new().webdriver_url("http://localhost:4444");
let browser = Arc::new(BrowserSession::new(config));
browser.start().await?;

let toolset = BrowserToolset::new(browser.clone())
    .with_navigation(true)
    .with_extraction(true)
    .with_screenshot(true);

let mut builder = LlmAgentBuilder::new("researcher")
    .model(model)
    .instruction(r#"
        You are a web research assistant. When asked about a topic:
        1. Navigate to relevant websites using browser_navigate
        2. Extract key information using browser_extract_text
        3. Take screenshots of important content using browser_screenshot
        4. Summarize your findings
    "#);

for tool in toolset.all_tools() {
    builder = builder.tool(tool);
}

let agent = builder.build()?;

示例:表单自动化

let agent = LlmAgentBuilder::new("form_filler")
    .model(model)
    .instruction(r#"
        You are a form automation assistant. To fill forms:
        1. Use browser_navigate to go to the form page
        2. Use browser_extract_text to see form labels
        3. Use browser_type to fill text fields
        4. Use browser_select for dropdowns
        5. Use browser_click to submit
    "#)
    .build()?;

配置

let config = BrowserConfig::new()
    .webdriver_url("http://localhost:4444")
    .headless(true)
    .viewport(1920, 1080)
    .page_load_timeout(30)
    .user_agent("Custom User Agent");

let browser = Arc::new(BrowserSession::new(config));
browser.start().await?;

WebDriver 选项

适用于任何 WebDriver-兼容的服务器:

服务器命令
Selenium (Chrome)docker run -d -p 4444:4444 selenium/standalone-chrome
Selenium (Firefox)docker run -d -p 4444:4444 selenium/standalone-firefox
ChromeDriverchromedriver --port=4444
GeckoDrivergeckodriver --port=4444

错误处理

浏览器工具返回结构化错误:

match result {
    Ok(value) => println!("Success: {:?}", value),
    Err(e) => {
        match e {
            BrowserError::ElementNotFound(selector) => {
                println!("Could not find element: {}", selector);
            }
            BrowserError::Timeout(duration) => {
                println!("Operation timed out after {:?}", duration);
            }
            BrowserError::SessionClosed => {
                println!("Browser session was closed");
            }
            _ => println!("Browser error: {}", e),
        }
    }
}

示例

cargo check -p adk-browser
cargo check -p adk-rust --no-default-features --features browser

最佳实践

  1. 使用等待:始终在与动态内容交互之前使用 browser_wait_* 工具
  2. 最小化截图:截图成本高昂;请策略性地使用它们
  3. 关闭会话:完成后始终关闭浏览器会话
  4. 处理错误:浏览器自动化可能会失败;请优雅地处理超时
  5. 筛选工具:只给 Agent 它们所需的工具以降低复杂性

上一页← 内置工具 | 下一页UI 工具 →