adk-browser crate는 AI 에이전트가 웹 페이지와 상호 작용할 수 있도록 하는 46가지 포괄적인 브라우저 자동화 도구를 제공합니다. WebDriver 프로토콜(Selenium)을 기반으로 구축되었으며, 모든 WebDriver 호환 브라우저에서 작동합니다.
개요
브라우저 도구를 통해 에이전트는 다음을 수행할 수 있습니다:
- 웹 페이지 탐색 및 브라우저 기록 관리
- 텍스트, 링크, 이미지 및 구조화된 데이터 추출
- 양식 작성 및 페이지 요소와 상호 작용
- 스크린샷 촬영 및 PDFs 생성
- 고급 자동화를 위한 JavaScript 실행
- 쿠키, 프레임 및 여러 창 관리
빠른 시작
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()를 호출할 필요가 없습니다. 세션은 첫 사용 시 투명하게 시작됩니다.
| 도구 | 설명 |
|---|
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 알림을 처리 |
| Tool | 설명 |
|---|
browser_get_cookies | 모든 쿠키 가져오기 |
browser_get_cookie | 특정 쿠키 가져오기 |
browser_add_cookie | 쿠키 추가 |
browser_delete_cookie | 쿠키 삭제 |
browser_delete_all_cookies | 모든 쿠키 삭제 |
| 도구 | 설명 |
|---|
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 | 창 크기 설정 |
| Tool | 설명 |
|---|
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)"
예시: 웹 리서치 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 |
| 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 도구 →