adk-browser crate 提供 46 个全面的浏览器自动化工具,使 AI agent 能够与网页进行交互。它基于 WebDriver 协议(Selenium)构建,可与任何兼容 WebDriver 的浏览器配合使用。
概述
浏览器工具允许 agent:
- 浏览网页并管理浏览器历史记录
- 提取文本、链接、图像和结构化数据
- 填写表单并与页面元素交互
- 截取屏幕截图并生成 PDFs
- 执行 JavaScript 以实现高级自动化
- 管理 cookies、框架和多个窗口
快速开始
添加到你的 Cargo.toml 中:
[dependencies]
adk-browser = "2.1.0"
adk-agent = "2.1.0"
adk-model = "2.1.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-3.7-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(())
}
仅选择 agent 所需的工具:
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() ——会话会在首次使用时透明地启动。
| 工具 | 描述 |
|---|
browser_navigate | 导航至 URL |
browser_back | 返回历史记录 |
browser_forward | 在历史记录中前进 |
browser_refresh | 刷新当前页面 |
| 工具 | 描述 |
|---|
browser_extract_text | 从元素中提取可见文本 |
browser_extract_attribute | 获取元素的属性值 |
browser_extract_links | 提取页面上的所有链接 |
browser_page_info | 获取当前 URL 和标题 |
browser_page_source | 获取 HTML 源代码 |
| 工具 | 描述 |
|---|
browser_click | 点击元素 |
browser_double_click | 双击元素 |
browser_type | 在元素中输入文本 |
browser_clear | 清除输入字段 |
browser_select | 选择下拉选项 |
| 工具 | 描述 |
|---|
browser_wait_for_element | 等待元素出现 |
browser_wait | 等待一段时间 |
browser_wait_for_page_load | 等待页面加载 |
browser_wait_for_text | 等待文本出现 |
| 工具 | 描述 |
|---|
browser_screenshot | 捕获页面或元素屏幕截图 |
| 工具 | 描述 |
|---|
browser_evaluate_js | 执行 JavaScript 代码 |
browser_scroll | 滚动页面 |
browser_hover | 将鼠标悬停在元素上 |
browser_handle_alert | 处理 JavaScript 警报 |
| 工具 | 描述 |
|---|
browser_get_cookies | 获取所有 Cookie |
browser_get_cookie | 获取特定 Cookie |
browser_add_cookie | 添加 Cookie |
browser_delete_cookie | 删除 Cookie |
browser_delete_all_cookies | 删除所有 Cookie |
| 工具 | 描述 |
|---|
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 | 设置窗口大小 |
| 工具 | 描述 |
|---|
browser_switch_to_frame | 切换到 iframe |
browser_switch_to_parent_frame | 切换到父框架 |
browser_switch_to_default_content | 切换到主文档 |
| 工具 | 描述 |
|---|
browser_drag_and_drop | 拖放元素 |
browser_right_click | 右键单击元素 |
browser_focus | 聚焦元素 |
browser_element_state | 获取元素状态(可见、启用、已选择) |
browser_press_key | 按下键盘按键 |
browser_file_upload | 将文件上传到输入框 |
browser_print_to_pdf | 从页面生成 PDF |
元素选择器
定位元素的工具接受 CSS 选择器:
// 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)"
示例:网页研究代理
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 |
| ChromeDriver | chromedriver --port=4444 |
| GeckoDriver | geckodriver --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
最佳实践
- 使用等待:在与动态内容交互之前,始终使用
browser_wait_* 工具
- 尽量减少屏幕截图:屏幕截图成本较高;请策略性地使用
- 关闭会话:完成后始终关闭浏览器会话
- 处理错误:浏览器自动化可能会失败;请妥善处理超时
- 筛选工具:仅向代理提供其所需的工具,以降低复杂性
上一页:← 内置工具 | 下一页:UI 工具 →