Automator

Chrome DevTools Protocol scraper for Elixir. Spawn headless Chromium, navigate pages, evaluate JavaScript, and extract data.

Installation

Add :automator to your dependencies:

def deps do
  [
    {:automator, "~> 0.1.0"}
  ]
end

Requires Chromium installed and available on PATH as chromium.

Quick Start

# Start a scraper (spawns Chromium + connects automatically)
{:ok, scraper} = Automator.Scraper.start_link()

# Navigate to a page
Automator.Scraper.navigate(scraper, "https://example.com")

# Evaluate JavaScript
title = Automator.Scraper.eval(scraper, "document.title")
# => "Example Domain"

# Wait for an element to appear
Automator.Scraper.wait_for_selector(scraper, "h1")

# Click an element
Automator.Scraper.click(scraper, "a")

# Take a screenshot (returns base64)
%{"data" => base64} = Automator.Scraper.screenshot(scraper)

# Set cookies
Automator.Scraper.set_cookie(scraper, "name", "value", ".example.com")

# Cleanup
Automator.Scraper.stop(scraper)

API

Automator.Scraper

High-level API that manages a Chromium instance and page connection.

Function Description
start_link/0 Spawn Chromium and connect to a page
navigate/2 Navigate to URL, waits ~1s for load
eval/2 Evaluate JavaScript, returns the result value
click/2 Click element by CSS selector
wait_for_selector/3 Wait for element to appear (default 10s timeout)
screenshot/1 Capture page screenshot as base64
set_cookie/4 Set a cookie (name, value, domain)
stop/1 Kill Chromium and cleanup

Automator.Chromium

Low-level Chromium process management.

browser = Automator.Chromium.spawn()
# => %{chromium: #Port<...>, os_pid: 1234, port: 9222, ws_url: "ws://..."}

Automator.Chromium.kill(browser)

Automator.Client

Low-level Automator WebSocket client for sending raw commands.

{:ok, client} = Automator.Client.start_link(ws_url)
{:ok, result} = Automator.Client.send_command(client, "Browser.getVersion")

License

MIT