docs-v2/scripts/puppeteer/README.md

563 lines
15 KiB
Markdown

# Puppeteer Integration for AI Agent Development
This directory contains Puppeteer utilities designed to help AI agents (like Claude) test and debug the InfluxData documentation site during development.
## Purpose
Puppeteer enables AI agents to:
- **See what's happening** - Take screenshots to visually inspect pages
- **Debug interactively** - Launch a browser to manually test features
- **Gather context** - Inspect page metadata, performance, errors, and structure
- **Test components** - Verify JavaScript components are working correctly
- **Validate content** - Check for shortcode remnants, broken links, and accessibility issues
## Installation
### Step 1: Install dependencies
Due to network restrictions, install Puppeteer without downloading the browser binary:
```bash
PUPPETEER_SKIP_DOWNLOAD=true yarn install
```
### Step 2: Configure Chrome path (if needed)
If you're using system Chrome instead of Puppeteer's bundled browser, set the path in your scripts:
**Common Chrome paths:**
- macOS: `/Applications/Google Chrome.app/Contents/MacOS/Google Chrome`
- Linux: `/usr/bin/google-chrome`
- Windows: `C:\Program Files\Google\Chrome\Application\chrome.exe`
You can pass the Chrome path using the `--chrome` flag:
```bash
yarn debug:browser /influxdb3/core/ --chrome "/usr/bin/google-chrome"
```
### Step 3: Start Hugo server
Before using Puppeteer tools, make sure the Hugo development server is running:
```bash
npx hugo server
```
The server should be accessible at `http://localhost:1313`.
## Quick Start for AI Agents
### Common Debugging Workflow
When a user reports an issue or you need to debug something:
1. **Start Hugo server** (if not already running)
```bash
npx hugo server
```
2. **Inspect the page** to gather information
```bash
yarn debug:inspect /influxdb3/core/get-started/
```
3. **Take a screenshot** to see visual issues
```bash
yarn debug:screenshot /influxdb3/core/get-started/ --full-page
```
4. **Open browser interactively** if you need to test manually
```bash
yarn debug:browser /influxdb3/core/get-started/ --devtools
```
## Available Tools
### 1. Page Inspector (`yarn debug:inspect`)
Gather comprehensive information about a page:
```bash
yarn debug:inspect <url-path> [options]
```
**What it reports:**
- Page metadata (title, description, language)
- Performance metrics (load time, FCP, etc.)
- Console errors and warnings
- Links analysis (internal/external counts)
- Detected components (`data-component` attributes)
- Shortcode remnants (Hugo shortcodes that didn't render)
- Basic accessibility checks
- Content structure (headings, code blocks)
**Examples:**
```bash
# Inspect a page
yarn debug:inspect /influxdb3/core/
# Save report to JSON
yarn debug:inspect /influxdb3/core/ --output report.json
# Also capture a screenshot
yarn debug:inspect /influxdb3/core/ --screenshot
```
**Use cases:**
- User reports a page isn't loading correctly
- Need to check if a page has JavaScript errors
- Want to verify shortcodes are rendering properly
- Need performance metrics for optimization
### 2. Screenshot Tool (`yarn debug:screenshot`)
Capture screenshots of pages or specific elements:
```bash
yarn debug:screenshot <url-path> [options]
```
**Options:**
- `--output PATH` - Save to specific file
- `--full-page` - Capture entire scrollable page
- `--selector CSS` - Capture specific element
- `--viewport WxH` - Set viewport size (e.g., `375x667` for mobile)
**Examples:**
```bash
# Basic screenshot
yarn debug:screenshot /influxdb3/core/
# Full page screenshot
yarn debug:screenshot /influxdb3/core/ --full-page
# Screenshot of specific element
yarn debug:screenshot /influxdb3/core/ --selector .article--content
# Mobile viewport screenshot
yarn debug:screenshot /influxdb3/core/ --viewport 375x667
# Custom output path
yarn debug:screenshot /influxdb3/core/ --output debug/home-page.png
```
**Use cases:**
- User reports visual issue ("the button is cut off")
- Need to see how page looks at different viewport sizes
- Want to capture a specific component for documentation
- Need before/after images for PR review
### 3. Interactive Browser (`yarn debug:browser`)
Launch a browser window for manual testing:
```bash
yarn debug:browser <url-path> [options]
```
**Options:**
- `--devtools` - Open Chrome DevTools automatically
- `--slow-mo NUM` - Slow down actions by NUM milliseconds
- `--viewport WxH` - Set viewport size
- `--base-url URL` - Use different base URL
**Examples:**
```bash
# Open page in browser
yarn debug:browser /influxdb3/core/
# Open with DevTools
yarn debug:browser /influxdb3/core/ --devtools
# Slow down for debugging
yarn debug:browser /influxdb3/core/ --slow-mo 500
# Mobile viewport
yarn debug:browser /influxdb3/core/ --viewport 375x667
```
**Use cases:**
- Need to manually click through a workflow
- Want to use Chrome DevTools to debug JavaScript
- Testing responsive design breakpoints
- Verifying interactive component behavior
## Programmatic Usage
AI agents can also use the helper functions directly in custom scripts:
```javascript
import {
launchBrowser,
navigateToPage,
takeScreenshot,
getPageMetrics,
elementExists,
getElementText,
clickAndNavigate,
testComponent,
} from './utils/puppeteer-helpers.js';
// Launch browser
const browser = await launchBrowser({ headless: true });
// Navigate to page
const page = await navigateToPage(browser, '/influxdb3/core/');
// Check if element exists
const hasFormatSelector = await elementExists(page, '[data-component="format-selector"]');
console.log('Format selector present:', hasFormatSelector);
// Get text content
const title = await getElementText(page, 'h1');
console.log('Page title:', title);
// Take screenshot
await takeScreenshot(page, 'debug.png');
// Get performance metrics
const metrics = await getPageMetrics(page);
console.log('Load time:', metrics.performance.loadComplete);
// Close browser
await browser.close();
```
## Common Scenarios
### Scenario 1: User reports "shortcodes are showing as raw text"
```bash
# Inspect the page for shortcode remnants
yarn debug:inspect /path/to/page/
# Take a screenshot to see the issue
yarn debug:screenshot /path/to/page/ --full-page --output shortcode-issue.png
```
**What to look for in the report:**
- `shortcodeRemnants` section will show any `{{<` or `{{%` patterns
- Screenshot will show visual rendering
### Scenario 2: User reports "page is loading slowly"
```bash
# Inspect page for performance metrics
yarn debug:inspect /path/to/page/ --output performance-report.json
# Check the report for:
# - performance.performance.loadComplete (should be < 3000ms)
# - performance.performance.firstContentfulPaint (should be < 1500ms)
```
### Scenario 3: User reports "JavaScript error in console"
```bash
# Inspect page for console errors
yarn debug:inspect /path/to/page/
# Open browser with DevTools to see detailed error
yarn debug:browser /path/to/page/ --devtools
```
**What to look for:**
- `errors` section in inspection report
- Red error messages in DevTools console
- Stack traces showing which file/line caused the error
### Scenario 4: User reports "component not working on mobile"
```bash
# Take screenshot at mobile viewport
yarn debug:screenshot /path/to/page/ --viewport 375x667 --output mobile-view.png
# Open browser at mobile viewport for testing
yarn debug:browser /path/to/page/ --viewport 375x667 --devtools
```
### Scenario 5: Testing a Hugo shortcode implementation
```bash
# 1. Inspect test page for components
yarn debug:inspect /example/ --screenshot
# 2. Take screenshots of different states
yarn debug:screenshot /example/ --selector '[data-component="tabs-wrapper"]'
# 3. Open browser to test interactivity
yarn debug:browser /example/ --devtools
```
### Scenario 6: Validating responsive design
```javascript
// Create a custom script: test-responsive.js
import { launchBrowser, navigateToPage, takeScreenshot, testResponsive } from './utils/puppeteer-helpers.js';
const browser = await launchBrowser();
const page = await navigateToPage(browser, '/influxdb3/core/');
const viewports = [
{ width: 375, height: 667, name: 'iPhone SE' },
{ width: 768, height: 1024, name: 'iPad' },
{ width: 1280, height: 720, name: 'Desktop' },
{ width: 1920, height: 1080, name: 'Desktop HD' },
];
const results = await testResponsive(page, viewports, async (page, viewport) => {
await takeScreenshot(page, `responsive-${viewport.name}.png`);
const hasNav = await elementExists(page, '[data-component="mobile-nav"]');
return { hasNav };
});
console.log('Responsive test results:', results);
await browser.close();
```
```bash
node scripts/puppeteer/test-responsive.js
```
## Helper Functions Reference
See `utils/puppeteer-helpers.js` for complete documentation. Key functions:
### Browser & Navigation
- `launchBrowser(options)` - Launch browser instance
- `navigateToPage(browser, urlPath, options)` - Navigate to page
- `clickAndNavigate(page, selector)` - Click and wait for navigation
### Elements
- `elementExists(page, selector)` - Check if element exists
- `waitForElement(page, selector, timeout)` - Wait for element
- `getElementText(page, selector)` - Get element text content
- `getComputedStyles(page, selector, properties)` - Get CSS styles
### Screenshots & Visual
- `takeScreenshot(page, path, options)` - Capture screenshot
- `compareScreenshots(baseline, current, diff)` - Compare images
- `testResponsive(page, viewports, testFn)` - Test at different sizes
### Analysis
- `getPageMetrics(page)` - Get performance metrics
- `getPageLinks(page)` - Get all links on page
- `captureConsoleLogs(page)` - Capture console output
- `debugPage(page, name)` - Save HTML + screenshot for debugging
### Testing
- `testComponent(page, selector, testFn)` - Test component behavior
## Troubleshooting
### Error: "Failed to launch browser"
**Problem:** Puppeteer can't find Chrome executable
**Solutions:**
1. **Use system Chrome:**
```bash
yarn debug:browser /path/ --chrome "/usr/bin/google-chrome"
```
2. **Install Puppeteer browser:**
```bash
npx puppeteer browsers install chrome
```
3. **Check common Chrome paths:**
- macOS: `/Applications/Google Chrome.app/Contents/MacOS/Google Chrome`
- Linux: `/usr/bin/google-chrome` or `/usr/bin/chromium`
- Windows: `C:\Program Files\Google\Chrome\Application\chrome.exe`
### Error: "Failed to navigate to http://localhost:1313"
**Problem:** Hugo server is not running
**Solution:**
```bash
# In a separate terminal
npx hugo server
```
### Error: "Element not found: .selector"
**Problem:** Element doesn't exist on page or page hasn't finished loading
**Solutions:**
1. **Wait for element:**
```javascript
await waitForElement(page, '.selector', 10000); // 10 second timeout
```
2. **Check if element exists first:**
```javascript
if (await elementExists(page, '.selector')) {
// Element exists, safe to interact
}
```
3. **Take screenshot to debug:**
```bash
yarn debug:screenshot /path/ --output debug.png
```
### Network restrictions blocking browser download
**Problem:** Cannot download Puppeteer's bundled Chrome due to network restrictions
**Solution:**
```bash
# Install without browser binary
PUPPETEER_SKIP_DOWNLOAD=true yarn install
# Use system Chrome with --chrome flag
yarn debug:browser /path/ --chrome "/usr/bin/google-chrome"
```
## Best Practices for AI Agents
### 1. Always check if Hugo server is running first
```bash
# Check if server is responding
curl -s -o /dev/null -w "%{http_code}" http://localhost:1313/
```
If it returns `000` or connection refused, start Hugo:
```bash
npx hugo server
```
### 2. Use inspection before screenshots
Inspection is faster and provides more context:
```bash
# First, inspect to understand the issue
yarn debug:inspect /path/
# Then take targeted screenshots if needed
yarn debug:screenshot /path/ --selector .problem-component
```
### 3. Prefer headless for automated checks
Headless mode is faster and doesn't require display:
```javascript
const browser = await launchBrowser({ headless: true });
```
Only use non-headless (`headless: false`) when you need to visually debug.
### 4. Clean up resources
Always close the browser when done:
```javascript
try {
const browser = await launchBrowser();
const page = await navigateToPage(browser, '/path/');
// ... do work
} finally {
await browser.close();
}
```
### 5. Use meaningful screenshot names
```bash
# Bad
yarn debug:screenshot /path/ --output screenshot.png
# Good
yarn debug:screenshot /influxdb3/core/ --output debug/influxdb3-core-home-issue-123.png
```
### 6. Capture full context for bug reports
When a user reports an issue, gather comprehensive context:
```bash
# 1. Inspection report
yarn debug:inspect /path/to/issue/ --output reports/issue-123-inspect.json --screenshot
# 2. Full page screenshot
yarn debug:screenshot /path/to/issue/ --full-page --output reports/issue-123-full.png
# 3. Element screenshot if specific
yarn debug:screenshot /path/to/issue/ --selector .problem-area --output reports/issue-123-element.png
```
## Integration with Development Workflow
### Use in PR Reviews
```bash
# Before changes
yarn debug:screenshot /path/ --output before.png
# Make changes to code
# After changes (restart Hugo if needed)
yarn debug:screenshot /path/ --output after.png
# Compare visually
```
### Use for Component Development
When developing a new component:
```bash
# 1. Open browser to test interactively
yarn debug:browser /example/ --devtools
# 2. Inspect for errors and components
yarn debug:inspect /example/
# 3. Take screenshots for documentation
yarn debug:screenshot /example/ --selector '[data-component="new-component"]'
```
### Use for Regression Testing
```bash
# Create baseline screenshots
yarn debug:screenshot /influxdb3/core/ --output baselines/core-home.png
yarn debug:screenshot /influxdb3/core/get-started/ --output baselines/core-get-started.png
# After changes, compare
yarn debug:screenshot /influxdb3/core/ --output current/core-home.png
# Visual comparison (manual for now, can be automated with pixelmatch)
```
## Next Steps
1. **Install dependencies** when you have network access:
```bash
PUPPETEER_SKIP_DOWNLOAD=true yarn install
```
2. **Configure Chrome path** if needed (see [Troubleshooting](#troubleshooting))
3. **Test the setup** with a simple example:
```bash
npx hugo server # In one terminal
yarn debug:screenshot / # In another terminal
```
4. **Start using for development** - See [Common Scenarios](#common-scenarios)
## Related Documentation
- [Puppeteer API Documentation](https://pptr.dev/)
- [Chrome DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/)
- [Hugo Documentation](https://gohugo.io/documentation/)
- [Testing Guide](../../DOCS-TESTING.md)
- [Contributing Guide](../../DOCS-CONTRIBUTING.md)