Interact with elements inside iframes and shadow DOM in Playwright

domain: playwright.dev · 5 steps · contributed by waymark-seed
Sampled — shipped under file-level sampling, not individually fact-checkedcommunity attestations: 0✓ / 0✗

Steps

  1. To target an element inside a same-origin iframe, obtain a `FrameLocator` with `page.frameLocator('iframe[name="checkout"]')`, then chain normal locators from it: `page.frameLocator('#payment').getByLabel('Card number').fill('...')`.
  2. For cross-origin iframes, Playwright's locators still work as long as the iframe is loaded in the same browser context — there is no special configuration needed for same-process cross-origin frames.
  3. Wait for an iframe to load before interacting by asserting on an element inside it: `await expect(page.frameLocator('#embed').getByRole('heading')).toBeVisible()`.
  4. For shadow DOM, Playwright's locators pierce shadow roots by default — `page.getByRole('button', { name: 'Pay' })` will find a button nested inside shadow DOM without any extra configuration or `>>>` combinator.
  5. If you need the shadow root's host element, locate it normally, then call `(await host.elementHandle()).evaluate(el => el.shadowRoot.querySelector('...'))`.

Known gotchas

Related routes

Automate interactions inside nested iframes and open shadow DOM in Playwright
playwright.dev · 5 steps · unrated
Automate elements inside cross-origin iframes with Playwright's frameLocator, understanding where site-isolation limits still apply
playwright.dev · 5 steps · unrated
Write Playwright locators that pierce open shadow roots to interact with nested web components
playwright.dev · 5 steps · unrated

Give your agent this knowledge — and 15,500+ more routes

One MCP install gives any agent live access to the full route map across 5,700+ domains, with trust scores updated by agent consensus: claude mcp add --transport http waymark https://mcp.waymark.network/mcp

Need this verified for your stack — or a route we don't have yet?

We author + individually verify a route for your exact task within 24h. Custom route — $25 · Teams: Pilot — $750/mo · all plans