> ## Documentation Index
> Fetch the complete documentation index at: https://docs.browser-use.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Playwright, Puppeteer, Selenium

> Control a Browser Use cloud browser directly over CDP.

Every browser runs in a [hardened Chromium fork](/cloud/browser/stealth) with
stealth, anti-fingerprinting, and [residential
proxies](/cloud/browser/proxies) enabled by default.

<Note>
  This page is for direct browser control. To give an AI agent a goal instead,
  [create an API V4 run](/cloud/agent/quickstart).
</Note>

## 1. Create a browser

```bash theme={null}
session=$(curl -sS https://api.browser-use.com/api/v4/browsers \
  -H "X-Browser-Use-API-Key: $BROWSER_USE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"proxyCountryCode":"us"}')

export BROWSER_SESSION_ID=$(echo "$session" | jq -r .id)
export BROWSER_USE_CDP_URL=$(echo "$session" | jq -r .cdpUrl)
```

## 2. Connect over CDP

### Playwright

<CodeGroup>
  ```python Python theme={null}
  import os
  from playwright.sync_api import sync_playwright

  with sync_playwright() as p:
      browser = p.chromium.connect_over_cdp(os.environ["BROWSER_USE_CDP_URL"])
      page = browser.contexts[0].pages[0]
      page.goto("https://example.com")
      print(page.title())
  ```

  ```typescript TypeScript theme={null}
  import { chromium } from "playwright";

  const browser = await chromium.connectOverCDP(
    process.env.BROWSER_USE_CDP_URL!,
  );
  const page = browser.contexts()[0].pages()[0];
  await page.goto("https://example.com");
  console.log(await page.title());
  ```
</CodeGroup>

### Puppeteer

```typescript theme={null}
import puppeteer from "puppeteer-core";

const browser = await puppeteer.connect({
  browserWSEndpoint: process.env.BROWSER_USE_CDP_URL!,
});
const [page] = await browser.pages();
await page.goto("https://example.com");
console.log(await page.title());
```

### Selenium

Selenium's `debugger_address` only supports local `host:port` connections.
Use Playwright or Puppeteer for remote CDP over WebSocket.

## 3. Stop the browser

```bash theme={null}
curl -X PATCH \
  "https://api.browser-use.com/api/v4/browsers/$BROWSER_SESSION_ID" \
  -H "X-Browser-Use-API-Key: $BROWSER_USE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"action":"stop"}'
```

<Warning>
  `browser.close()` and disconnecting CDP do not stop the managed browser.
  Call `PATCH /api/v4/browsers/{id}` with `{"action":"stop"}`.
</Warning>

See [Create browser session](/cloud/api-v4/browsers/create-browser-session) and
[Update browser session](/cloud/api-v4/browsers/update-browser-session) for
every browser setting and response field.
