Skip to content

Introduce raise_on_unhandled_modal browser configuration - #324

Merged
route merged 2 commits into
mainfrom
pr-320-raise-on-unhandled-modal
Aug 25, 2026
Merged

Introduce raise_on_unhandled_modal browser configuration#324
route merged 2 commits into
mainfrom
pr-320-raise-on-unhandled-modal

Conversation

@route

@route route commented Aug 25, 2026

Copy link
Copy Markdown
Member

The problem

When executing a system test suite that relies on confirm, prompt, or other browser-level modals, the default behavior to ignore modally presented dialogs can cause false negatives.

For example, a change to the implementation might accidentally introduce a perpetually prompting confirmation modal. While the test suite outputs "Modal window … has been opened" warnings, the underlying test still passes.

The proposal

This commit proposes a new Cuprite-level :raise_on_unhandled_modal option to control whether an unhandled modal warns, or raises. When set to true, then false negative test would fail, rather than pass.

The problem
---

When executing a system test suite that relies on `confirm`, `prompt`,
or other browser-level modals, the default behavior to ignore modally
presented dialogs can cause false negatives.

For example, a change to the implementation might accidentally introduce
a perpetually prompting confirmation modal. While the test suite outputs
"Modal window … has been opened" warnings, the underlying test still
passes.

The proposal
---

This commit proposes a new Cuprite-level `:raise_on_unhandled_modal`
option to control whether an unhandled modal warns, or raises. When set
to `true`, then false negative test would fail, rather than pass.
@route
route force-pushed the pr-320-raise-on-unhandled-modal branch 2 times, most recently from e965401 to 935b189 Compare August 25, 2026 05:51
Browser#initialize mutated the caller's options hash with delete
instead of dig, so Driver#reset! (called between every Capybara
example) always saw the option as absent and forced it back to false
after the very first use — the option never actually took effect via
normal driver configuration.

Raising directly from the Page.javascriptDialogOpening handler also
doesn't work: that callback runs on Ferrum's background CDP dispatcher
thread, so the exception never reaches the caller and permanently
kills that thread, wedging the browser for the rest of the suite
(reproduced: it cascades into unrelated failures in later examples).
The dialog is now always answered first, on Ferrum's own command
(captured via alias before overriding it), and the error is deferred
and re-raised from the main thread on its next command call via
ensure, so it fires whether or not that command itself raised.

Also raises a proper Capybara::Cuprite::UnhandledModalError instead of
a bare RuntimeError, and adds a CHANGELOG entry.
@route
route force-pushed the pr-320-raise-on-unhandled-modal branch from 935b189 to e6751bb Compare August 25, 2026 05:57
@route
route merged commit bfddb1f into main Aug 25, 2026
7 checks passed
@route
route deleted the pr-320-raise-on-unhandled-modal branch August 25, 2026 05:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants