Ferramentas de Navegador

A crate adk-browser oferece 46 ferramentas abrangentes de automação de navegador que permitem aos AI agents interagir com páginas web. Construída sobre o protocolo WebDriver (Selenium), ela funciona com qualquer navegador compatível com WebDriver.

Visão Geral

As ferramentas de navegador permitem que os agents:

  • Navegar em páginas web e gerenciar o histórico do navegador
  • Extrair texto, links, imagens e dados estruturados
  • Preencher formulários e interagir com elementos da página
  • Tirar screenshots e gerar PDFs
  • Executar JavaScript para automação avançada
  • Gerenciar cookies, frames e múltiplas janelas

Início Rápido

Adicione ao seu Cargo.toml:

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

Pré-requisitos

Inicie um servidor 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

Uso Básico

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.0-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(())
}

Ferramentas Filtradas

Selecione apenas as ferramentas que o seu agent precisa:

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();

Ferramentas Disponíveis (Total de 46)

ToolDescrição
browser_navigateNavegar para uma URL
browser_backVoltar no histórico
browser_forwardAvançar no histórico
browser_refreshAtualizar página atual

Extração (5 ferramentas)

ToolDescrição
browser_extract_textExtrair texto visível do elemento
browser_extract_attributeObter valor de atributo do elemento
browser_extract_linksExtrair todos os links da página
browser_page_infoObter URL e título atuais
browser_page_sourceObter código-fonte HTML

Interação (5 ferramentas)

ToolDescrição
browser_clickClicar em um elemento
browser_double_clickClicar duas vezes em um elemento
browser_typeDigitar texto no elemento
browser_clearLimpar um campo de entrada
browser_selectSelecionar opção de dropdown

Espera (4 ferramentas)

ToolDescrição
browser_wait_for_elementEsperar o elemento aparecer
browser_waitEsperar por uma duração
browser_wait_for_page_loadEsperar a página carregar
browser_wait_for_textEsperar o texto aparecer

Capturas de Tela (1 ferramenta)

ToolDescrição
browser_screenshotCapturar captura de tela da página ou elemento

JavaScript (4 ferramentas)

ToolDescrição
browser_evaluate_jsExecutar código JavaScript
browser_scrollRolar a página
browser_hoverPassar o mouse sobre um elemento
browser_handle_alertLidar com alertas JavaScript

Cookies (5 ferramentas)

ToolDescrição
browser_get_cookiesObter todos os cookies
browser_get_cookieObter cookie específico
browser_add_cookieAdicionar um cookie
browser_delete_cookieExcluir um cookie
browser_delete_all_cookiesExcluir todos os cookies

Janelas/Abas (8 ferramentas)

ToolDescrição
browser_list_windowsListar todas as janelas/abas
browser_new_tabAbrir nova aba
browser_new_windowAbrir nova janela
browser_switch_windowTrocar para a janela
browser_close_windowFechar janela atual
browser_maximize_windowMaximizar janela
browser_minimize_windowMinimizar janela
browser_set_window_sizeDefinir tamanho da janela

Frames (3 ferramentas)

ToolDescrição
browser_switch_to_frameTrocar para iframe
browser_switch_to_parent_frameTrocar para o frame pai
browser_switch_to_default_contentTrocar para o documento principal

Ações (7 ferramentas)

ToolDescrição
browser_drag_and_dropArrastar e soltar elementos
browser_right_clickClicar com o botão direito no elemento
browser_focusFocar no elemento
browser_element_stateObter estado do elemento (visível, habilitado, selecionado)
browser_press_keyPressionar tecla do teclado
browser_file_uploadFazer upload de arquivo para entrada
browser_print_to_pdfGerar PDF a partir da página

Seletores de Elementos

Ferramentas que visam elementos aceitam seletores CSS:

// Por ID
"#login-button"

// Por classe
".submit-btn"

// Por tag e atributo
"input[type='email']"

// Por atributo de dados
"[data-testid='search']"

// Seletores complexos
"form.login input[name='password']"

// N-ésimo filho
"ul.menu li:nth-child(3)"

Exemplo: Agente de Pesquisa Web

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()?;

Exemplo: Automação de Formulários

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()?;

Configuração

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?;

Opções do WebDriver

Funciona com qualquer servidor compatível com WebDriver:

ServidorComando
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

Tratamento de Erros

As ferramentas do navegador retornam erros estruturados:

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),
        }
    }
}

Exemplos

# Basic browser session
cargo run --example browser_basic

# AI agent with browser tools
cargo run --example browser_agent

# Full 46-tool interactive example
cargo run --example browser_interactive

# OpenAI-powered browser agent
cargo run --example browser_openai --features openai

Melhores Práticas

  1. Use Esperas: Sempre use as ferramentas browser_wait_* antes de interagir com conteúdo dinâmico
  2. Minimize Capturas de Tela: Capturas de tela são caras; use-as estrategicamente
  3. Feche Sessões: Sempre feche as sessões do navegador quando terminar
  4. Trate Erros: A automação do navegador pode falhar; trate os tempos limite graciosamente
  5. Filtre Ferramentas: Dê aos agentes apenas as ferramentas de que precisam para reduzir a complexidade

Anterior: ← Ferramentas Incorporadas | Próximo: Ferramentas de UI →