Loading...
Loading...
Headless browser testing via persistent Bun.WebView session. Use when testing frontend UI, verifying page content, filling forms, clicking buttons, taking screenshots, or interacting with local or staging web applications. Triggers on phrases like "test the page", "check the UI", "browse to", "fill the form", "click the button", "take a screenshot".
npx skill4agent add naticha/bunwv bunwvbunwv <command>bun install -g @naticha/bunwv--session <name>bunwv start [--width N] [--height N] [--data-store PATH] [--idle-timeout ms]
[--backend webkit|chrome] [--chrome-path PATH]
bunwv navigate <url>
bunwv click <selector> | <x> <y>
bunwv click-text <text> [--tag <selector>]
bunwv type <text>
bunwv press <key> [--mod meta,ctrl,shift]
bunwv clear <selector>
bunwv submit [--form <selector>] [--button <text>]
bunwv scroll <dx> <dy> | <selector>
bunwv screenshot [filename] [--format png|jpeg|webp] [--quality 0-100]
bunwv eval <expression>
bunwv console [--clear] [--since <timestamp>]
bunwv cdp <method> [--params '{}']
bunwv wait-for <selector> [--timeout ms]
bunwv wait-for-gone <selector> [--timeout ms]
bunwv status
bunwv resize <width> <height>
bunwv back
bunwv forward
bunwv reload
bunwv sessions
bunwv stopbunwv start # starts "default" session
bunwv start --session cmais # starts a separate "cmais" session
bunwv navigate http://localhost:3000 --session cmais
bunwv sessions # list all running sessions
bunwv stop --session cmais # stop a specific session--idle-timeoutbunwv start --idle-timeout 3600000 # 1 hour
bunwv start --idle-timeout 0 # never auto-shutdownstart$ bunwv start
Reusing existing session "default" (PID: 12345)
URL: http://localhost:3000/dashboardbunwv sessionsbunwv startbunwv navigate http://localhost:3000bunwv screenshot /tmp/bunwv-screenshot.pngbunwv click "button.submit"bunwv stopclick-textbunwv click-text "Save Changes"
bunwv click-text "Sign In"
bunwv click-text "Delete" --tag "button, a, div"button, a, [role='button'], input[type='submit']--tagclearbunwv clear "input[name='email']"
bunwv click "input[name='email']"
bunwv type "new-value@example.com"clearclicktypewait-forbunwv click-text "Save Changes"
bunwv wait-for-gone "[role='dialog']" # wait for modal to close
bunwv screenshot /tmp/bunwv-screenshot.png # then screenshot
bunwv click-text "Edit"
bunwv wait-for "[role='dialog']" # wait for modal to appear
bunwv screenshot /tmp/bunwv-screenshot.png--timeoutbunwv wait-for ".results" --timeout 30000evalconstletvarifbunwv eval "document.title"
bunwv eval "document.querySelector('h1')?.textContent"
bunwv eval "document.querySelectorAll('.error').length"
bunwv eval "const rows = document.querySelectorAll('tr'); return rows.length;"submitclick-textclick-text.click()isTrusted: falsesubmitform.requestSubmit()bunwv submit # submit the first form on the page
bunwv submit --button "Save Changes" # submit via a specific button
bunwv submit --form "form.edit-quote" # target a specific form
bunwv submit --form "form" --button "Save" # bothwait-for-gonewait-forbunwv submit --button "Save Changes"
bunwv wait-for-gone "[role='dialog']"
bunwv screenshot /tmp/bunwv-screenshot.pngbunwv click "input[name='email']"
bunwv type "user@example.com"
bunwv press Tab
bunwv type "password123"
bunwv submit --button "Sign In".env$VARbunwv type "$TEST_EMAIL"--data-storebunwv start --data-store ./bunwv-sessionconsole.logconsole.errorbunwv navigate http://localhost:3000
bunwv click "button.submit"
bunwv console # see any errors or logs from the page
bunwv console --clear # read and clear the buffer--since <timestamp>--format--qualitybunwv screenshot --format jpeg --quality 80 # saves /tmp/bunwv-screenshot.jpg
bunwv screenshot --format webp --quality 90 # saves /tmp/bunwv-screenshot.webp
bunwv screenshot output.jpg --format jpeg # custom filenamebunwv start --backend chrome # force Chrome on macOS
bunwv start --chrome-path /path/to/chromium # custom Chrome pathbunwv cdp "Page.getLayoutMetrics"
bunwv cdp "Network.enable"
bunwv cdp "Runtime.evaluate" --params '{"expression": "1+1"}'eval/tmp/bunwv-screenshot.png.jpg.webp--format--backendclickclick-text.click()submitclearclick x yisTrusted: trueevalgetBoundingClientRect()