/form-filling
Fill out web forms, submit data, and handle login or registration flows. Trigger when the user asks to: fill a form, submit data on a website, log in to a site, register an account, complete a checkout, enter information into fields, or automate form submission.
$ npx -y skills add billy-enrizky/openbrowser-ai --skill form-filling --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/form-filling
Context preview
The summary Claude sees to decide when to auto-load this skill.
Fill out web forms, submit data, and handle login or registration flows. Trigger when the user asks to: fill a form, submit data on a website, log in to a site, register an account, complete a checkout, enter information into fields, or automate form submission.
SKILL.md
form-filling.SKILL.mdname: form-filling
description: |
Fill out web forms, submit data, and handle login or registration flows.
Trigger when the user asks to: fill a form, submit data on a website, log in to a site,
register an account, complete a checkout, enter information into fields, or automate form submission.
allowed-tools: Bash(openbrowser-ai:*) Bash(curl:*) Bash(uv:*) Bash(irm:*) Read Write
Form Filling
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`.
The CLI daemon also persists cookies and login state in `~/.config/openbrowser/profiles/daemon/storage_state.json`, so authenticated sessions can be reused across later runs.
Setup
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
Workflow
Step 1 -- Navigate to the form page
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)}")
EOFStep 2 -- Discover form fields
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}\"")
EOFStep 3 -- Fill text inputs
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")
EOFStep 4 -- Handle dropdowns
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 }));
})()
""")
EOFStep 5 -- Handle checkboxes and radio buttons
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}")
EOFStep 6 -- Submit the form
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}")
EOFOr submit via JavaScript:
openbrowser-ai -c - <<'EOF'
await evaluate("document.querySelector(\"form\").submit()")
EOFStep 7 -- Verify submission result
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)
EOFStep 8 -- Handle multi-step forms
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
EOFTips
- Code is piped via stdin using heredoc (`-c - <<'EOF'`), so all Python syntax works without shell escaping issues.
- Always discover fields with `browser.get_browser_state_summary()` before typing -- do not guess element indices.
- For sensitive data (passwords, tokens), confirm with the user before entering values.
- Use `evaluate()` to bypass custom components that do not respond to standard click/type.
- Variables persist between `-c` calls while the daemon is running, so you can store field indices in one call and use them in the next.
- Check for CAPTCHA or bot detection; notify the user if manual intervention is needed.
Cleanup
This step is **mandatory**. Run it after the form submission finishes, whether the submit succeeded or the form rejected the input. Without it, the daemon keeps Chrome running until its 10-minute idle timeout, leaving a stale browser process, a locked profile, and (on macOS/Linux desktop) a visible window with the form still on screen.
Stop the daemon, then verify it is gone:
openbrowser-ai daemon stop
openbrowser-ai daemon status
Read more
name: form-filling description: | Fill out web forms, submit data, and handle login or registration flows. Trigger when the user asks to: fill a form, submit data on a website, log in to a site, register an account, complete a checkout, enter information into fields, or automate form submission. allowed-tools: Bash(openbrowser-ai:*) Bash(curl:*) Bash(uv:*) Bash(irm:*) Read Write
Form Filling
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`.
The CLI daemon also persists cookies and login state in `~/.config/openbrowser/profiles/daemon/storage_state.json`, so authenticated sessions can be reused across later runs.
Setup
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
Workflow
Step 1 -- Navigate to the form page
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)}")
EOFStep 2 -- Discover form fields
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}\"")
EOFStep 3 -- Fill text inputs
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")
EOFStep 4 -- Handle dropdowns
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 }));
})()
""")
EOFStep 5 -- Handle checkboxes and radio buttons
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}")
EOFStep 6 -- Submit the form
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}")
EOFOr submit via JavaScript:
openbrowser-ai -c - <<'EOF'
await evaluate("document.querySelector(\"form\").submit()")
EOFStep 7 -- Verify submission result
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)
EOFStep 8 -- Handle multi-step forms
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
EOFTips
- Code is piped via stdin using heredoc (`-c - <<'EOF'`), so all Python syntax works without shell escaping issues.
- Always discover fields with `browser.get_browser_state_summary()` before typing -- do not guess element indices.
- For sensitive data (passwords, tokens), confirm with the user before entering values.
- Use `evaluate()` to bypass custom components that do not respond to standard click/type.
- Variables persist between `-c` calls while the daemon is running, so you can store field indices in one call and use them in the next.
- Check for CAPTCHA or bot detection; notify the user if manual intervention is needed.
Cleanup
This step is **mandatory**. Run it after the form submission finishes, whether the submit succeeded or the form rejected the input. Without it, the daemon keeps Chrome running until its 10-minute idle timeout, leaving a stale browser process, a locked profile, and (on macOS/Linux desktop) a visible window with the form still on screen.
Stop the daemon, then verify it is gone:
openbrowser-ai daemon stop openbrowser-ai daemon status
OpenBrowser is a framework for intelligent browser automation. It combines direct CDP communication with a CodeAgent architecture, where the LLM writes Python code executed in a persistent namespace, to navigate, interact with, and extract information from web pages autonomously.
Repo: billy-enrizky/openbrowser-ai
Other skills on openbrowser-ai.
- /accessibility-audit
Audit web pages for accessibility issues, WCAG compliance, and screen reader compatibility. Trigger when the user asks to: check accessibility, run an a11y audit, test WCAG compliance, check screen reader support, audit ARIA attributes, verify keyboard navigation, find
Open skill - /deep-research
Conduct deep web research using the openbrowser-ai agent: decompose a query, investigate sub-questions across multiple sources, and produce a cited markdown report plus structured JSON under local_docs/research/. Trigger when the user asks to: research a topic, do a deep dive,
Open skill - /e2e-testing
Test web applications end-to-end by simulating user interactions and verifying expected outcomes. Trigger when the user asks to: test a web app, verify a user flow, run end-to-end tests, QA a feature, check that a page works correctly, validate user journeys, or test a
Open skill - /file-download
Download files from websites, save PDFs, and read downloaded content. Trigger when the user asks to: download a file, save a PDF, export a document, fetch a file from a URL, grab a report, download and read a PDF, or save page content as a file.
Open skill - /page-analysis
Analyze web page content, structure, and layout to understand what a page contains and how it is organized. Trigger when the user asks to: analyze a page, understand page structure, inspect a website, summarize page content, examine page layout, review a web page, or describe
Open skill - /web-scraping
Extract structured data from websites, scrape page content, and collect information across multiple pages. Trigger when the user asks to: extract data from a website, scrape a page, collect information from URLs, pull content from web pages, gather data across multiple pages, or
Open skill

