Skip to main content

Crate ferrous_browser

Crate ferrous_browser 

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

Modules§

browser
Browser automation API
cdp
Chrome DevTools Protocol types and client
connection
WebSocket connection management
error
Error types
har
HTTP Archive (HAR) capture
page
Page automation API