last update
Jun 2, 2026
license
MITv1.0.0
format
SKILL.md
- Install
// Downloads SKILL.md into ~/.claude/skills/browser-use/
$ curl -fsSL --create-dirs -o ~/.claude/skills/browser-use/SKILL.md https://claudeskil.com/skills/browser-use/SKILL.md - Invoke
// Inside Claude Code, type the skill name as a slash command
> /browser-use write Playwright tests for this page - Or just ask
// Claude loads the skill by itself when a request matches its description
> write Playwright tests for this page
- name:
- Browser Use
- slug:
- browser-use
- version:
- v1.0.0
- license:
- MIT
- author:
- @chiragthummar16
- categories:
- tags:
- #browser#playwright#automation#scraping#testing
- description:
Automate browser interactions — web testing, form filling, screenshots, scraping, multi-tab workflows.
README.md
Browser Use
Browser Use drives a real, headful or headless browser through Playwright (with a Selenium fallback) so an agent can interact with pages the way a person does: clicking, typing, waiting on network, and reading rendered DOM. It is built for developers who need automation that survives JavaScript-heavy SPAs, authentication walls, and bot-detection layers — not brittle HTTP scraping.
When to use it
- End-to-end testing of a login flow, checkout, or multi-step wizard where each step depends on rendered state.
- Scraping data that only exists after client-side rendering, infinite scroll, or behind a session cookie.
- Filling and submitting forms (including file uploads and date pickers) across one or several tabs.
- Capturing full-page or element screenshots for visual regression or reporting.
- Reaching sites guarded by Cloudflare, PerimeterX, or similar where a plain
requestscall returns a challenge page.
How it works
Each action maps to a Playwright primitive. Navigation uses page.goto(url, wait_until="networkidle"). Elements are targeted with role/text locators (page.get_by_role, page.get_by_text) rather than raw CSS to stay resilient to markup changes. Interactions auto-wait via locator.click(), locator.fill(), and expect(locator).to_be_visible(). Uploads use set_input_files; multi-tab work is handled through context.pages and context.expect_page(). Screenshots come from page.screenshot(full_page=True). Persistent auth is saved and replayed with storage_state JSON, so you log in once. Anti-detection relies on playwright-stealth patches plus realistic user_agent, locale, and viewport on the browser context.
Example
curl -fsSL --create-dirs -o ~/.claude/skills/browser-use/SKILL.md https://claudeskil.com/skills/browser-use/SKILL.md
# saved as scrape_orders.py
ctx = browser.new_context(storage_state="auth.json", locale="en-US")
page = ctx.new_page()
page.goto("https://app.example.com/orders", wait_until="networkidle")
page.get_by_role("button", name="Export").click()
with page.expect_download() as dl:
page.get_by_text("Download CSV").click()
dl.value.save_as("./orders.csv")
page.screenshot(path="orders.png", full_page=True)
Tips & gotchas
- Prefer
wait_until="networkidle"over fixedsleepcalls; arbitrary sleeps are the top cause of flaky runs. - Generate
auth.jsononce with a headful login, then reuse it — re-authenticating on every run is what trips rate limits and detection. - Stealth patches reduce fingerprinting but do not defeat CAPTCHA. For hard challenges, route through a CAPTCHA-solving service or a residential proxy.
- Run headless in CI but reproduce failures with
headless=Falseandslow_mo=500to watch what actually happens.
FAQ
Playwright or Selenium? Playwright is the default — faster, auto-waiting, better multi-tab handling. Selenium is available for legacy Grid setups or unusual driver requirements.
Can it bypass Cloudflare? It clears most passive JS challenges via stealth and a real browser context. Interactive CAPTCHAs still require a solver or human-in-the-loop.
How do I keep a session logged in? Save context.storage_state(path="auth.json") after login and pass it to new_context(storage_state=...) on later runs.
$ cat reviews/