أدوات المتصفح

توفر حزمة adk-browser 46 أداة شاملة لأتمتة المتصفح، تُمكّن الوكلاء ذوي الذكاء الاصطناعي من التفاعل مع صفحات الويب. وبُنيت على بروتوكول WebDriver (Selenium)، وهي تعمل مع أي متصفح متوافق مع WebDriver.

نظرة عامة

تتيح أدوات المتصفح للوكلاء ما يلي:

  • التنقل في صفحات الويب وإدارة سجل المتصفح
  • استخراج النصوص والروابط والصور والبيانات المنظمة
  • ملء النماذج والتفاعل مع عناصر الصفحة
  • التقاط لقطات الشاشة وإنشاء PDFs
  • تنفيذ JavaScript لأتمتة متقدمة
  • إدارة ملفات تعريف الارتباط والإطارات والنوافذ المتعددة

البدء السريع

أضف إلى 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(())
}

الأدوات المصفّاة

حدّد الأدوات التي يحتاج إليها وكيلك فقط:

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انتظر ظهور النص

لقطات الشاشة (أداة واحدة)

الأداةالوصف
browser_screenshotالتقاط لقطة شاشة للصفحة أو العنصر

JavaScript (4 أدوات)

الأداةالوصف
browser_evaluate_jsتنفيذ تعليمات برمجية JavaScript
browser_scrollتمرير الصفحة
browser_hoverمرّر مؤشر الفأرة فوق عنصر
browser_handle_alertمعالجة تنبيهات JavaScript

ملفات تعريف الارتباط (5 أدوات)

الأداةالوصف
browser_get_cookiesالحصول على جميع ملفات تعريف الارتباط
browser_get_cookieالحصول على ملف تعريف ارتباط محدد
browser_add_cookieإضافة ملف تعريف ارتباط
browser_delete_cookieحذف ملف تعريف ارتباط
browser_delete_all_cookiesحذف جميع ملفات تعريف الارتباط

Windows/Tabs (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 أدوات)

الأداةالوصف
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:

// 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
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. رشّح الأدوات: امنح الوكلاء الأدوات التي يحتاجون إليها فقط لتقليل التعقيد

السابق: ← الأدوات المضمّنة | التالي: أدوات واجهة المستخدم →