# Handle Modal Dialog

> Detects and dismisses blocking modal dialogs (generic confirmations, "are you sure", interstitials, signed-out prompts). Sibling to dismiss-newsletter-popup and dismiss-cookie-banner.

- **Type:** Skill
- **Install:** `agentstack add skill-bettyguo-browser-skills-handle-modal-dialog`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [bettyguo](https://agentstack.voostack.com/s/bettyguo)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [bettyguo](https://github.com/bettyguo)
- **Source:** https://github.com/bettyguo/browser-skills/tree/main/skills/handle-modal-dialog

## Install

```sh
agentstack add skill-bettyguo-browser-skills-handle-modal-dialog
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## 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

1. wait_for_dom_ready timeout=2s
2. wait extra=200ms
3. 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
4. wait extra=300ms

## Success criteria

- assert no_visible_element selector="[role='dialog'][aria-modal='true']" OR no_change_was_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-flow` instead.
- A cookie banner that happens to use `role="dialog"` — `dismiss-cookie-banner` is more specific and runs first per matcher ordering.

## Known failures

- **Modals without ARIA semantics (~10% of legacy sites):** sites that use plain `` overlays without `role="dialog"` won't match the markers. Vision fallback or a follow-on `exit-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 `keypress` primitive in v0.2.
- **Bootstrap 4 vs Bootstrap 5 attribute drift:** `data-dismiss` (BS4) vs `data-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 apply
- `dismiss-newsletter-popup` — more specific; runs first when both apply
- `exit-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](https://github.com/bettyguo)
- **Source:** [bettyguo/browser-skills](https://github.com/bettyguo/browser-skills)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-bettyguo-browser-skills-handle-modal-dialog
- Seller: https://agentstack.voostack.com/s/bettyguo
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
