Install
$ agentstack add skill-bettyguo-browser-skills-handle-modal-dialog ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Handle Modal Dialog
When to invoke
A generic catch-all for blocking dialogs that aren't specifically cookie banners or newsletter popups: e.g., a "Continue without saving?" confirmation, an "Are you 13+?" age gate prompt that's not blocking-blocking, a "Choose your region" modal, an "App available — open in app?" interstitial.
The matcher scores this skill highly when the DOM contains role="dialog" or aria-modal="true" AND no cookie-banner / newsletter-popup-specific markers are present (otherwise the more specific skills win).
This skill defaults to "dismiss" — it clicks the close button or the "no thanks" / "stay on web" / "not now" path. If the user task requires accepting the dialog, the agent should not invoke this skill.
Recipe
- waitfordom_ready timeout=2s
- wait extra=200ms
- try_each selectors=[
"[role='dialog'] button[aria-label='close' i]", "[role='dialog'] button[aria-label='dismiss' i]", "[aria-modal='true'] button[aria-label*='close' i]", "button.modal-close", ".modal button:has-text('Close')", ".modal button:has-text('No thanks')", ".modal button:has-text('Not now')", ".modal button:has-text('Stay on web')", ".modal button:has-text('Maybe later')", "[role='dialog'] button:has-text('Cancel')", ".modal button.btn-close", "button[data-dismiss='modal']", "button[data-bs-dismiss='modal']", ] action=click on_success=stop timeout=1500ms
- wait extra=300ms
Success criteria
- assert novisibleelement selector="[role='dialog'][aria-modal='true']" OR nochangewas_needed
When NOT to use
- The user task is interacting with the modal (filling a quick form, selecting a region, confirming an action). Don't dismiss what the user wants to engage.
- A login modal — use
login-flowinstead. - A cookie banner that happens to use
role="dialog"—dismiss-cookie-banneris more specific and runs first per matcher ordering.
Known failures
- Modals without ARIA semantics (~10% of legacy sites): sites that use plain `
overlays withoutrole="dialog"won't match the markers. Vision fallback or a follow-onexit-tracking-popup`-style skill handles. - Modals with intercept-everything backdrops: dismissing the modal via Escape key would work but isn't implemented in v0.1; add
keypressprimitive in v0.2. - Bootstrap 4 vs Bootstrap 5 attribute drift:
data-dismiss(BS4) vsdata-bs-dismiss(BS5). Both selectors above; one will match. - Cascading modals (one closes, another appears): v0.1 dismisses one and returns; the agent must re-invoke if the next state has another modal.
Example usage
Agent task: "Get me the cheapest flight on this page."
→ matcher sees a "We've detected you're outside the US — go to region site?" modal
→ invoke_skill("handle-modal-dialog") → success, "Stay on web" clicked
→ agent continues with the original task
Related skills
dismiss-cookie-banner— more specific; runs first when both applydismiss-newsletter-popup— more specific; runs first when both applyexit-tracking-popup— for "Wait, before you go!" exit-intent dialogs
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: bettyguo
- Source: bettyguo/browser-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.