Step Helpers

highlight

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

What it does

highlight(locator) captures an element's bounding box and stores it as a Playwright annotation. During video generation, the renderer draws an animated marker overlay that sweeps in from left to right, highlighting the element during the step's time window.

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