Step Helpers

highlight

Highlight an element or specific text in the demo video with an animated marker overlay.

What it does

highlight(locator) measures the element's viewport bounding box and emits a marker-prefixed test.step() directly into the Playwright trace zip. During video generation, subtitlesFromTrace() picks up these markers automatically and the renderer draws an animated overlay that sweeps in from left to right at the recorded position.

You don't need to call .textHighlight() in the pipeline when using highlight() — the trace step is self-contained. You can still call .textHighlight() if you want to load highlights from an external report.json file instead.

You can highlight an entire element or a specific substring within it.

Usage

import { highlight } from 'playwright-recast'

// Highlight an entire element
const heading = page.locator('h1')
await highlight(heading)

// Highlight specific text within an element
const paragraph = page.locator('.description')
await highlight(paragraph, { text: 'important detail' })

Parameters

ParameterTypeDefaultDescription
locatorLocator(required)Playwright Locator pointing to the element
opts.textstringundefinedSpecific text to highlight (substring match). If omitted, highlights the entire element.
opts.colorstring'#FFEB3B'Highlight color as hex #RRGGBB
opts.opacitynumber0.35Highlight opacity (0.0--1.0)
opts.durationnumber3000Visibility duration in milliseconds
opts.fadeOutnumber500Fade out duration in milliseconds
opts.swipeDurationnumber300Swipe-in animation duration in milliseconds

Highlighting specific text

When you pass the text option, the helper finds the exact substring within the element and measures its bounding box:

  • Regular elements: Uses the browser Range API to locate the text node and measure its position
  • Input/textarea elements: Creates a temporary mirror overlay to measure text position within form fields
const input = page.locator('input[name="email"]')
await highlight(input, { text: '@example.com' })

Customizing appearance

await highlight(heading, {
  color: '#FF5722',      // Orange highlight
  opacity: 0.5,          // More visible
  duration: 5000,        // Show for 5 seconds
  swipeDuration: 500,    // Slower reveal animation
})

Example in a BDD step

import { Then } from './fixtures'
import { narrate, highlight, pace } from 'playwright-recast'

Then('the total is displayed', async ({ page }, docString?: string) => {
  narrate(docString)
  const total = page.locator('[data-testid="order-total"]')
  await highlight(total, { text: '$42.99' })
  await pace(page, 3000)
})
Then the total is displayed
  """
  The order total is calculated and displayed at the bottom.
  """

The video will show a yellow marker sweeping across "$42.99" during this step.

On this page