From openbrowser
Automates filling web forms, logins, registrations, checkouts, multi-step wizards using openbrowser-ai for browser control with indexed selectors for inputs, dropdowns, checkboxes.
npx claudepluginhub billy-enrizky/openbrowser-ai --plugin openbrowserThis skill is limited to using the following tools:
Automate filling web forms including login, registration, checkout, and multi-step form wizards using Python code execution.
Automates browser tasks like form filling, data extraction, and multi-step web workflows using Yutori's Navigator agent. Useful for interacting with websites via clicks, typing, or navigation.
CLI browser automation: navigate URLs, snapshot pages with @refs, click/type elements by ref/text/query, extract structured data/markdown, search/filter web content.
Automates browser tasks via CLI: navigate pages, extract data, fill forms, click buttons, take screenshots. Supports stealth remote sessions with CAPTCHA solving for protected sites.
Share bugs, ideas, or general feedback.
Automate filling web forms including login, registration, checkout, and multi-step form wizards using Python code execution.
All code runs via openbrowser-ai -c. The daemon starts automatically and persists variables across calls. All browser functions are async -- use await.
Before running, verify openbrowser-ai is installed:
openbrowser-ai --help
If not found, install:
# macOS/Linux
curl -fsSL https://raw.githubusercontent.com/billy-enrizky/openbrowser-ai/main/install.sh | sh
# Windows (PowerShell)
irm https://raw.githubusercontent.com/billy-enrizky/openbrowser-ai/main/install.ps1 | iex
openbrowser-ai -c - <<'EOF'
await navigate("https://example.com/login")
state = await browser.get_browser_state_summary()
print(f"Page: {state.title} ({state.url})")
print(f"Interactive elements: {len(state.dom_state.selector_map)}")
EOF
openbrowser-ai -c - <<'EOF'
# List all interactive elements with their indices
state = await browser.get_browser_state_summary()
for index, element in state.dom_state.selector_map.items():
tag = element.tag_name
text = element.get_all_children_text(max_depth=2)[:60]
placeholder = element.attributes.get("placeholder", "")
input_type = element.attributes.get("type", "")
name = element.attributes.get("name", "")
print(f"[{index}] <{tag}> type={input_type} name={name} placeholder=\"{placeholder}\" text=\"{text}\"")
EOF
openbrowser-ai -c - <<'EOF'
# Fill fields using their indices from Step 2
await input_text(index=5, text="user@example.com")
await input_text(index=7, text="secure-password")
EOF
For fields that need clearing first:
openbrowser-ai -c - <<'EOF'
await click(index=5)
await evaluate("document.activeElement.select()")
await input_text(index=5, text="new-value")
EOF
Standard HTML select elements:
openbrowser-ai -c - <<'EOF'
await select_dropdown(index=12, text="United States")
EOF
To see available options first:
openbrowser-ai -c - <<'EOF'
options = await dropdown_options(index=12)
print(options)
EOF
Custom dropdown components:
openbrowser-ai -c - <<'EOF'
await evaluate("""
(function(){
const select = document.querySelector("select#country");
select.value = "US";
select.dispatchEvent(new Event("change", { bubbles: true }));
})()
""")
EOF
openbrowser-ai -c - <<'EOF'
await click(index=15) # Click checkbox/radio
# Verify state
checked = await evaluate("""document.querySelector("input[name=agree]").checked""")
print(f"Checkbox checked: {checked}")
EOF
openbrowser-ai -c - <<'EOF'
await click(index=20) # Click submit button
await wait(2)
# Verify submission
state = await browser.get_browser_state_summary()
print(f"After submit: {state.url}")
EOF
Or submit via JavaScript:
openbrowser-ai -c - <<'EOF'
await evaluate("document.querySelector(\"form\").submit()")
EOF
openbrowser-ai -c - <<'EOF'
# Check for success/error messages
result = await evaluate("""
(function(){
const success = document.querySelector(".success, .alert-success, [role=\"alert\"]");
const error = document.querySelector(".error, .alert-danger, .validation-error");
return {
success: success?.textContent?.trim(),
error: error?.textContent?.trim(),
url: window.location.href
};
})()
""")
print(result)
EOF
openbrowser-ai -c - <<'EOF'
for step in range(1, 5):
# Discover fields for current step
state = await browser.get_browser_state_summary()
print(f"Step {step}: {len(state.dom_state.selector_map)} elements")
# Fill fields (indices vary per step)
# ... fill fields here ...
# Click Next/Continue
# Find the next button
for idx, el in state.dom_state.selector_map.items():
text = el.get_all_children_text(max_depth=1).lower()
if "next" in text or "continue" in text:
await click(index=idx)
await wait(2)
break
EOF
-c - <<'EOF'), so all Python syntax works without shell escaping issues.browser.get_browser_state_summary() before typing -- do not guess element indices.evaluate() to bypass custom components that do not respond to standard click/type.-c calls while the daemon is running, so you can store field indices in one call and use them in the next.