The element is inside an iframe and a plain selector cannot reach it
A payment widget, an embedded editor, a third-party form. The frame border is a browser security boundary, not an oversight — and two scoped actions cross it properly.
The symptom. The page reads normally — a form is there, a payment
widget, an embedded editor, a third-party booking module. A plain cliquer
or remplir with a CSS selector finds nothing inside it, and the
accessibility tree stops at the frame’s edge too.
Why it stops there
An iframe is a separate document. When it comes from another origin, the browser forbids the page — and any script running in it — from reaching inside. That is a hard security boundary, and a good one: it is what stops any site from reading the contents of a payment frame it embeds.
No flag lifts this, and it should not: lifting it would be a browser vulnerability, not a missing feature.
Two scoped actions cross it properly
Playwright reaches into frames through the debugging protocol rather than by injecting script, which is legitimate where injection would not be. Dinoer exposes it as two actions:
{"type": "cliquer_iframe", "iframe_selecteur": "iframe#payment",
"selecteur": "button.confirm"}
{"type": "remplir_iframe", "iframe_selecteur": "iframe#payment",
"selecteur": "input[name=cvv]",
"valeur": "depuis_secrets", "secret_cle": "cvv"}
remplir_iframe supports depuis_secrets and depuis_secrets_totp exactly
like remplir — a credential inside a frame is still resolved in the browser
process, never written in the scenario.
force: true is available on cliquer_iframe too: Playwright’s
interactability rules apply inside the frame as they do outside.
An iframe inside an iframe
iframe_selecteur targets one top-level frame. Nested frames need a descent
through each level, in order:
{"type": "cliquer_iframe",
"iframe_chemin": ["iframe#wrapper", "iframe#payment"],
"selecteur": "button.confirm"}
An ordered array, one CSS selector per nesting level. The two forms are mutually exclusive — use one or the other, not both.
The limit, stated plainly
There is no accessibility-tree structure inside the frame. You need the inner CSS selector yourself.
Where to get it: if the iframe is same-origin, an evaluer can read it —
document.querySelector('iframe').contentDocument. If it is cross-origin,
you will not get it from the page: read the third party’s own documentation,
or open the frame’s URL directly in a browser and inspect it there.
This is a first unlock, not full iframe-aware perception. Saying so is more useful than letting you discover it against a form that will not fill.
In short
- Cross-origin iframes are a hard browser boundary — no flag lifts it, on purpose.
cliquer_iframe/remplir_iframewithiframe_selecteurfor one level.iframe_chemin— an ordered array — for nested frames.- Credential resolution, including TOTP, works inside frames exactly as outside.
- You supply the inner selector; Dinoer supplies the crossing.