Skip to main content
The Puppeteer driver provides the familiar Puppeteer API for Chrome/Chromium automation.

Connect

import { puppeteer } from '@bctrl/sdk';

const session = await puppeteer.connect({
  apiKey: process.env.BCTRL_API_KEY
});

const page = session.page;
await page.goto('https://example.com');
await page.goto('https://example.com', { waitUntil: 'networkidle0' });

await page.goBack();
await page.goForward();
await page.reload();

const url = page.url();
const title = await page.title();

Selectors & Actions

// Click
await page.click('button');
await page.click('button', { clickCount: 2 });

// Type
await page.type('input[name="email"]', '[email protected]');
await page.type('input', 'Hello', { delay: 100 });

// Query elements
const element = await page.$('button');
const elements = await page.$$('li');

// Fill (clears first)
await page.click('input');
await page.keyboard.down('Control');
await page.keyboard.press('A');
await page.keyboard.up('Control');
await page.keyboard.type('new text');

Getting Content

// Text content
const text = await page.$eval('h1', el => el.textContent);
const texts = await page.$$eval('li', els => els.map(el => el.textContent));

// Attributes
const href = await page.$eval('a', el => el.getAttribute('href'));

// Inner HTML
const html = await page.$eval('div', el => el.innerHTML);

Evaluate JavaScript

// Simple
const title = await page.evaluate(() => document.title);

// With arguments
const text = await page.evaluate(
  selector => document.querySelector(selector)?.textContent,
  'h1'
);

// Complex return
const data = await page.evaluate(() => ({
  url: location.href,
  height: document.body.scrollHeight
}));

Screenshots

await page.screenshot({ path: 'screenshot.png' });
await page.screenshot({ path: 'full.png', fullPage: true });

const buffer = await page.screenshot({ encoding: 'binary' });

Mouse & Keyboard

// Mouse
await page.mouse.move(100, 200);
await page.mouse.click(100, 200);
await page.mouse.wheel({ deltaY: 500 });

// Keyboard
await page.keyboard.press('Enter');
await page.keyboard.type('Hello World');
await page.keyboard.down('Shift');
await page.keyboard.press('ArrowDown');
await page.keyboard.up('Shift');

Waiting

await page.waitForSelector('button');
await page.waitForSelector('button', { visible: true });
await page.waitForNavigation();
await page.waitForTimeout(1000);

AI Agents

await session.stagehand.act('Click the submit button');

const data = await session.stagehand.extract(
  'Get all product prices',
  z.array(z.number())
);

Full Example

import { puppeteer } from '@bctrl/sdk';

async function main() {
  const session = await puppeteer.connect({
    apiKey: process.env.BCTRL_API_KEY
  });

  const page = session.page;
  await page.goto('https://example.com');

  // Fill form
  await page.type('#email', '[email protected]');
  await page.type('#password', 'password123');
  await page.click('button[type="submit"]');

  await page.waitForNavigation();
  console.log('Logged in:', page.url());

  await session.close();
}

main();