Skip to main content

Finding components

Three ways to find the components you want, mirroring the ways they're identified. All three are methods on your experience handle — and on any component — so there's nothing extra to import:

const experience = await connect()

experience.findByLocator('hero') // by the name you gave it in Flex
experience.findByTag('cml-video') // by component type
experience.findById('a1b2c3') // by internal id

Two things are true of all of them:

  • They always return a ComponentSet — 0, 1, or many matches. There's no separate single-component return type; one match is a set of one. Narrow with .only() or .first() when you want the component itself.
  • They query the page as it is right now. There's no waiting and no live updating: components that appear later aren't added to a set you already captured. Look them up again when you need them.

findByLocator(locator)

findByLocator(locator: string): ComponentSet

The one you'll use most. Finds every component carrying the name you assigned in Flex's SDK Locators inspector.

// react to a click on any element named "cta"
experience.findByLocator('cta').on('component.click', (event) => {
console.log('clicked', event.target.cmlLocator)
})

Locators behave like CSS classes:

  • Reuse a name to group elements. Three cards sharing the locator card are all returned by findByLocator('card'), and one call reaches all three.
  • One element can carry several names, space-separated. An element named cta hero matches findByLocator('cta') and findByLocator('hero').
  • Query one name at a time. A value containing a space never matches.

Because the locator is a name your team controls, it's the most stable way to target a component: restyling, resizing, and moving the element won't break it.

findByTag(tag)

findByTag(tag: string): ComponentSet

Finds every component of a given type. Useful for sweeping operations.

experience.findByTag('cml-video').media.pause() // pause every video

Common tags: cml-text, cml-video, cml-image, cml-rectangle, cml-oval, cml-polygon, cml-svg, cml-embed, cml-group, cml-section.

An invalid tag returns an empty set and logs a warning rather than throwing.

findById(id)

findById(id: string): ComponentSet

Finds the component with a given internal id. Ids are generated by Ceros rather than chosen by you, so reach for this only when you already have one in hand — from component.cmlId, say. Prefer findByLocator for anything you're writing by hand.

experience.findById('a1b2c3').only().componentType // 'cml-text'

Searching inside one component

A search is always scoped to the thing you call it on. Your experience handle covers the whole experience; calling the same method on a Component searches only that component's contents (and never matches the component itself):

const pricing = experience.findByLocator('pricing').only()

pricing.findByTag('cml-text') // only the text inside the pricing section

This is how you disambiguate a locator that's reused across sections — scope first, then find.

Which one to use

MethodReach for it when
findByLocatorAlmost always. You named the element in Flex and your script targets that name.
findByTagYou want every component of a kind — "pause all videos", "hide every embed".
findByIdYou already have an internal id from somewhere else. Rare.