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 security boundary of the browser, and two actions cross it.
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 too: it shows - iframe and nothing below.
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, to reach inside. That boundary is what stops a site from reading the content of a payment frame it embeds. No option lifts it for the page’s own scripts.
Two actions cross it
Playwright drives the browser from outside the page, so the same-origin rule that binds the page’s scripts does not bind it. Dinoer exposes this 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 accepts depuis_secrets and depuis_secrets_totp like
remplir: a credential inside a frame is still resolved in the browser
process, never written in the scenario.
cliquer_iframe accepts force: true: Playwright’s checks before a click
apply inside the frame as they do outside.
An iframe inside an iframe
iframe_selecteur targets one frame of the page. Nested frames need a
descent through each level, in order:
{"type": "cliquer_iframe",
"iframe_chemin": ["iframe#wrapper", "iframe#payment"],
"selecteur": "button.confirm"}
An ordered list, one CSS selector per level. The two forms exclude each other: use one or the other, not both.
The limit
The accessibility tree does not show the inside of a frame. You need the inner CSS selector yourself.
Where to find it: if the iframe has the same origin as the page, an evaluer
can read it through document.querySelector('iframe').contentDocument. If it
comes from another origin, the page will not give it to you: read the
documentation of the third party, or open the address of the frame directly
and read it there with --a11y.
In short
- An iframe from another origin is a hard boundary of the browser for page scripts.
cliquer_iframe/remplir_iframewithiframe_selecteurfor one level.iframe_chemin, an ordered list, for nested frames.- Credentials, TOTP included, are resolved inside frames as outside.
- You supply the inner selector; Dinoer crosses the boundary.