Dinoer

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_iframe with iframe_selecteur for 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.