# Video Recording Capture browser automation sessions as video for debugging, documentation, or verification. Produces WebM (VP8/VP9 codec). ## Basic Recording ```bash # Open browser first mise exec -- npm run playwright:cli -- open # Start recording mise exec -- npm run playwright:cli -- video-start .artifacts/playwright-cli/demo.webm # Add a chapter marker for section transitions mise exec -- npm run playwright:cli -- video-chapter "Getting Started" --description="Opening the homepage" --duration=2000 # Navigate and perform actions mise exec -- npm run playwright:cli -- goto https://example.com mise exec -- npm run playwright:cli -- snapshot mise exec -- npm run playwright:cli -- click e1 # Add another chapter mise exec -- npm run playwright:cli -- video-chapter "Filling Form" --description="Entering test data" --duration=2000 mise exec -- npm run playwright:cli -- fill e2 "test input" # Stop and save mise exec -- npm run playwright:cli -- video-stop ``` ## Best Practices ### 1. Use Descriptive Filenames ```bash # Include context in filename mise exec -- npm run playwright:cli -- video-start .artifacts/playwright-cli/recordings/login-flow-2024-01-15.webm mise exec -- npm run playwright:cli -- video-start .artifacts/playwright-cli/recordings/checkout-test-run-42.webm ``` ### 2. Record entire hero scripts. When recording a video for the user or as a proof of work, it is best to create a code snippet and execute it with run-code. It allows inserting appropriate pauses between the actions and annotating the video. There are new Playwright APIs for that. 1) Perform scenario using CLI and take note of all locators and actions. You'll need those locators to request their bounding boxes for highlight. 2) Create a file with the intended script for video (below). Use pressSequentially w/ delay for nice typing, make reasonable pauses. 3) Use mise exec -- npm run playwright:cli -- run-code --filename your-script.js **Important**: Overlays are `pointer-events: none` — they do not interfere with page interactions. You can safely keep sticky overlays visible while clicking, filling, or performing any actions on the page. ```js async page => { await page.screencast.start({ path: 'video.webm', size: { width: 1280, height: 800 } }); await page.goto('https://demo.playwright.dev/todomvc'); // Show a chapter card — blurs the page and shows a dialog. // Blocks until duration expires, then auto-removes. // Use this for simple use cases, but always feel free to hand-craft your own beautiful // overlay via await page.screencast.showOverlay(). await page.screencast.showChapter('Adding Todo Items', { description: 'We will add several items to the todo list.', duration: 2000, }); // Perform action await page.getByRole('textbox', { name: 'What needs to be done?' }).pressSequentially('Walk the dog', { delay: 60 }); await page.getByRole('textbox', { name: 'What needs to be done?' }).press('Enter'); await page.waitForTimeout(1000); // Show next chapter await page.screencast.showChapter('Verifying Results', { description: 'Checking the item appeared in the list.', duration: 2000, }); // Add a sticky annotation that stays while you perform actions. // Overlays are pointer-events: none, so they won't block clicks. const annotation = await page.screencast.showOverlay(`