Testing Your Layout

September 12, 2026 · View on GitHub

Every element the library renders carries a data-layout-path attribute describing its position in the layout tree — a stable selector for end-to-end tests (FlexLayout's own Playwright suite is built on it; see tests-playwright/helpers.ts for ready-made helper functions):

PathElement
/r<n> / /ts<n>Row / tabset (n is the index within the parent), nested as in the model, e.g. /r1/ts0
/border/<location>Border strip (top, bottom, left, right)
.../tb<n>Tab button n, in the same tree location as its panel (e.g. panel /ts0/t0 ↔ button /ts0/tb0, and inside a group /ts0/g0/t0/ts0/g0/tb0); n is the tab's index within its parent
.../g<n>Group pill n (e.g. /ts0/g0, /border/right/g0)
.../g<n>/endGroup end marker (right cap of a split pill, e.g. /ts0/g0/end)
.../t<n>Tab panel n within a tabset or border path
.../tabstripA tabset's tab strip
.../s<n>Splitter after child n of a row (e.g. /s0), or a border's splitter
.../button/<name>Toolbar buttons: max, overflow, close, popout, float, pin
.../textboxThe inline rename textbox
/popup-menuThe overflow/popup menu
// playwright example: select the second tab of the first tabset, check a border panel opened
await page.locator('[data-layout-path="/ts0/tb1"]').click();
await expect(page.locator('[data-layout-path="/border/left/t0"]')).toBeVisible();

Note the paths describe the current structure, so indices shift when tabs and tabsets move — target stable states, or use node ids via the model for highly dynamic layouts.