Skip to content

Examples ​

This section contains practical examples demonstrating common use cases for zchrome.

Quick Reference ​

ExampleDescription
ScreenshotsCapture full-page and element screenshots
PDF GenerationGenerate PDFs from web pages
DOM ManipulationQuery and modify the DOM
JavaScript EvaluationExecute JavaScript and get results
Network InterceptionMonitor and modify network traffic (Zig API)
Browser InteractionsClick, type, fill forms using CLI
Macro RecordingRecord and replay browser interactions, video recording & streaming

Basic Pattern ​

Most zchrome scripts follow this pattern:

zig
const std = @import("std");
const cdp = @import("cdp");

pub fn main(init: std.process.Init) !void {
    const allocator = init.gpa;

    // 1. Launch browser
    var browser = try cdp.Browser.launch(.{
        .headless = .new,
        .allocator = allocator,
        .io = init.io,
    });
    defer browser.close();

    // 2. Create page/session
    var session = try browser.newPage();
    defer session.detach() catch {};

    // 3. Initialize domain clients
    var page = cdp.Page.init(session);
    try page.enable();

    // 4. Navigate
    _ = try page.navigate(allocator, "https://example.com");

    // 5. Wait for content (simplified)
    var i: u32 = 0;
    while (i < 500000) : (i += 1) {
        std.atomic.spinLoopHint();
    }

    // 6. Perform operations
    // ...
}

Running Examples ​

To run examples in this guide:

  1. Create a new Zig project:

    bash
    mkdir my-scraper
    cd my-scraper
    zig init
  2. Add zchrome dependency to build.zig.zon:

    zig
    .dependencies = .{
        .cdp = .{
            .path = "../zchrome",
        },
    },
  3. Configure build.zig:

    zig
    const cdp = b.dependency("cdp", .{
        .target = target,
        .optimize = optimize,
    });
    exe.root_module.addImport("cdp", cdp.module("cdp"));
  4. Build and run:

    bash
    zig build run

Tips ​

Waiting for Page Load ​

The examples use a simple spin-loop for waiting. In production:

zig
// Simple approach (examples)
var i: u32 = 0;
while (i < 500000) : (i += 1) {
    std.atomic.spinLoopHint();
}

// Better: Use lifecycle events
try page.setLifecycleEventsEnabled(true);
// Listen for "load" or "networkIdle" events

Error Handling ​

Always check for navigation errors:

zig
var result = try page.navigate(allocator, url);
defer result.deinit(allocator);

if (result.error_text) |err| {
    std.debug.print("Failed: {s}\n", .{err});
    return;
}

Resource Cleanup ​

Use defer consistently:

zig
var browser = try cdp.Browser.launch(.{ ... });
defer browser.close();

var session = try browser.newPage();
defer session.detach() catch {};

const data = try allocate();
defer allocator.free(data);

Multiple Pages ​

For parallel scraping:

zig
var sessions: [4]*cdp.Session = undefined;
for (&sessions) |*s| {
    s.* = try browser.newPage();
}
defer for (sessions) |s| {
    s.detach() catch {};
};

// Use each session for different URLs

Released under the MIT License.