use browsing::browser::{Browser, BrowserProfile};
use browsing::error::Result;
#[tokio::main]
async fn main() -> Result<()> {
browsing::init();
let headless = std::env::var("BROWSER_USE_HEADLESS")
.ok()
.and_then(|v| v.parse::<bool>().ok())
.unwrap_or(false);
println!("🚀 Basic Browser Navigation Example\n");
println!(
"Mode: {}\n",
if headless {
"headless (background)"
} else {
"visible"
}
);
let profile = BrowserProfile {
headless: Some(headless),
proxy: None,
..Default::default()
};
println!("📋 Step 1: Starting browser...");
let mut browser = Browser::new(profile);
browser.start().await?;
println!(" ✓ Browser started\n");
let target_url = "https://example.com";
println!("📋 Step 2: Navigating to {}...", target_url);
browser.navigate(target_url).await?;
tokio::time::sleep(tokio::time::Duration::from_secs(2)).await;
let current_url = browser.get_current_url().await?;
println!(" ✓ Current URL: {}\n", current_url);
let title = browser.get_current_page_title().await?;
println!("📋 Step 3: Page Information");
println!(" Title: {}", title);
println!(" URL: {}", current_url);
println!();
println!("📋 Step 4: Reading page content...");
let state = browser.get_browser_state_summary(true, None).await?;
println!(" 📄 Page Title: {}", state.title);
println!(" 🔗 URL: {}", state.url);
let dom_state = &state.dom_state;
if !dom_state.selector_map.is_empty() {
println!(
"\n 🔍 Found {} interactive elements:",
dom_state.selector_map.len()
);
for (i, (index, element)) in dom_state.selector_map.iter().take(5).enumerate() {
println!(
" [{}] {}: {} - {:?}",
i + 1,
index,
element.tag,
element.text.as_deref().unwrap_or(&"[no text]".to_string())
);
}
if dom_state.selector_map.len() > 5 {
println!(" ... and {} more", dom_state.selector_map.len() - 5);
}
}
if let Some(content) = &dom_state.text {
let lines: Vec<&str> = content.lines().take(3).collect();
if !lines.is_empty() {
println!("\n 📝 Text content preview:");
for line in lines {
println!(" {}", line);
}
if content.lines().count() > 3 {
println!(
" ... ({} more characters)",
content.len() - content.lines().take(3).map(|l| l.len()).sum::<usize>()
);
}
}
}
println!();
println!("📋 Step 5: Taking screenshot...");
let screenshot_path = "screenshot_example.png";
browser
.take_screenshot(Some(screenshot_path), false, None, None)
.await?;
println!(" ✓ Screenshot saved to: {}", screenshot_path);
println!();
println!("📋 Step 6: More navigation examples...");
println!(" • Navigating to Wikipedia...");
browser.navigate("https://www.wikipedia.org").await?;
tokio::time::sleep(tokio::time::Duration::from_secs(2)).await;
let wiki_title = browser.get_current_page_title().await?;
println!(" ✓ Loaded: {}", wiki_title);
println!();
println!("✅ Navigation example completed successfully!");
println!("\n💡 Tips:");
println!(" • Set BROWSER_USE_HEADLESS=true to run in background mode");
println!(" • The browser will stay open for a few seconds so you can see the result");
println!(" • Screenshots are saved to the current directory");
println!(" • Try modifying the target_url to visit different websites");
if !headless {
println!("\n⏳ Keeping browser open for 5 seconds for inspection...");
tokio::time::sleep(tokio::time::Duration::from_secs(5)).await;
}
println!("\n Closing browser...");
browser.stop().await?;
println!(" ✓ Browser closed gracefully");
Ok(())
}