Expand description
§ferrous-browser
Full browser automation in Rust. No Node.js. No compromises. Single binary.
ferrous-browser is a native Rust library for Chrome DevTools Protocol (CDP) communication, enabling full browser automation without Node.js.
§Quick Start
use ferrous_browser::{Browser, BrowserConfig, WaitUntil};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Launch Chrome with defaults (headless, 1280×720, 30 s timeout)
let browser = Browser::launch_chrome(None).await?;
// Create a new page/tab
let page = browser.new_page().await?;
// Navigate to a website
page.goto("https://example.com", WaitUntil::Load).await?;
// Get the HTML content
let html = page.content().await?;
println!("Page HTML: {}", html);
// Take a screenshot
let png_bytes = page.screenshot().await?;
std::fs::write("screenshot.png", png_bytes)?;
Ok(())
}§Features
- Zero Node.js dependency — Pure Rust implementation using tokio
- Single binary deployment — No external runtime required
- Async-first API — Built on tokio for high performance
- Type-safe — Rust’s type system catches errors at compile time
- Direct CDP access — Full control over Chrome’s DevTools Protocol
- Locator API — Playwright-style ergonomic element selectors
§Locator API
use ferrous_browser::{Browser, WaitUntil};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let browser = Browser::launch_chrome(None).await?;
let page = browser.new_page().await?;
page.goto("https://example.com", WaitUntil::Load).await?;
// Locator API
page.locator("button#submit").click().await?;
page.locator("input[name=q]").type_text("hello").await?;
page.locator(".result").wait_for().await?;
Ok(())
}§WaitUntil modes
use ferrous_browser::{Browser, WaitUntil};
let browser = Browser::launch_chrome(None).await?;
let page = browser.new_page().await?;
// DOM parsed, sub-resources may still load
page.goto("https://example.com", WaitUntil::DomContentLoaded).await?;
// All resources loaded (default)
page.goto("https://example.com", WaitUntil::Load).await?;
// No network requests for 500 ms (SPA-friendly)
page.goto("https://example.com", WaitUntil::NetworkIdle).await?;§Architecture
ferrous-browser is built on a layered architecture:
- CDPClient — Low-level CDP message routing
- Connection — WebSocket lifecycle management
- Browser — High-level browser control API
- Page — High-level page/tab automation API
- Locator — Lazy element handle for ergonomic element interaction
Re-exports§
pub use browser::Browser;pub use browser::BrowserConfig;pub use error::BrowserError;pub use error::ResultExt;pub use har::HarCapture;pub use page::Cookie;pub use page::Locator;pub use page::Page;pub use page::WaitUntil;