| name | description |
|---|---|
browser-automation |
Browser automation via Playwright. Navigate pages, click elements, fill forms, take screenshots, and extract data from websites. Use this skill whenever the user asks to interact with a website, scrape data, fill a form, take a screenshot, or automate any browser task.
|
This skill provides browser automation using Playwright, executed via uv.
All browser commands are executed through the exec (shell) tool.
This skill must never use pip install and must never modify system Python.
All Python execution MUST go through uv.
Playwright availability follows this strict priority order:
- Playwright installed as a user-wide uv tool (preferred)
- Ephemeral uv environment via
uv run --with playwright(fallback)
The skill MUST always attempt option 1 before option 2.
Before running ANY Playwright command, you MUST verify that Playwright is available.
playwright --versionIf this succeeds, Playwright is already available. Proceed directly to Usage.
If the command is not found, install Playwright as a user-wide uv tool:
uv tool install playwright
playwright install chromiumIf Chromium installation fails due to missing system dependencies on Linux:
playwright install-deps chromium
playwright install chromiumOnce this completes successfully, confirm to the user:
Browser automation is now ready (Playwright installed via uv tool).
If installing a user-wide tool is not possible, fall back to an isolated uv-managed environment:
uv run --with playwright playwright install chromiumConfirm to the user:
Browser automation is now ready (Playwright via uv run).
uv run python -c "
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto('https://example.com')
print(page.title())
browser.close()
"uv run --with playwright python -c "
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto('https://example.com')
print(page.title())
browser.close()
"from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto(URL, timeout=15000)
print(page.content())
print(page.title())
print(page.inner_text("body"))
browser.close()from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto(URL)
page.screenshot(path="/tmp/screenshot.png", full_page=True)
browser.close()from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto(URL)
page.fill('input[name="username"]', 'myuser')
page.fill('input[name="password"]', 'mypass')
page.click('button[type="submit"]')
page.wait_for_load_state("networkidle")
print(page.title())
browser.close()from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto(URL)
page.click("text=Sign In")
page.click("#submit-button")
page.select_option("select#country", "US")
page.keyboard.type("search query")
page.keyboard.press("Enter")
browser.close()page.wait_for_selector(".results-loaded", timeout=10000)
page.wait_for_load_state("networkidle")
page.wait_for_url("**/dashboard")from playwright.sync_api import sync_playwright
import json
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto(URL)
items = page.query_selector_all(".product-card")
results = []
for item in items:
results.append({
"name": item.query_selector(".name").inner_text(),
"price": item.query_selector(".price").inner_text(),
})
print(json.dumps(results, indent=2))
browser.close()For any browser automation task:
- Check Playwright CLI availability
- Install via
uv toolif missing - Fallback to
uv run --with playwrightif needed - Write a Python script if the task is multi-step
- Execute it via
uv - Return results (text, data, file paths)
- ❌ Never run
pip install - ❌ Never modify system Python
- ❌ Never assume Playwright is preinstalled
- ❌ Never skip browser installation
- ✅ Always use
uv - ✅ Always close browsers properly
- Use
headless=Trueunless explicitly requested otherwise - Set navigation timeouts:
page.goto(url, timeout=15000) - Use
page.wait_for_load_state("networkidle")for JS-heavy pages - Store artifacts in
/tmpor workspace directories - Prefer
with sync_playwright()for guaranteed cleanup page.wait_for_timeout(2000)is acceptable as a last-resort fallback