docs-v2/scripts/puppeteer/examples/test-format-selector.js

181 lines
5.3 KiB
JavaScript

#!/usr/bin/env node
/**
* Example: Test Format Selector Component
*
* This example demonstrates how to use Puppeteer to test an interactive
* component on the documentation site.
*
* Run with: node scripts/puppeteer/examples/test-format-selector.js
*/
import {
launchBrowser,
navigateToPage,
takeScreenshot,
elementExists,
waitForElement,
clickAndNavigate,
debugPage,
} from '../utils/puppeteer-helpers.js';
async function testFormatSelector() {
console.log('\n🧪 Testing Format Selector Component\n');
let browser;
try {
// Launch browser
console.log('Launching browser...');
browser = await launchBrowser({ headless: true });
// Navigate to a page with format selector
console.log('Navigating to page...');
const page = await navigateToPage(browser, '/influxdb3/core/get-started/');
// Check if format selector exists
console.log('\n1. Checking if format selector exists...');
const hasFormatSelector = await elementExists(
page,
'[data-component="format-selector"]'
);
if (!hasFormatSelector) {
console.log(' ⚠️ Format selector not found on this page');
console.log(
" This is expected if the page doesn't have multiple formats"
);
return;
}
console.log(' ✓ Format selector found');
// Take initial screenshot
console.log('\n2. Capturing initial state...');
await takeScreenshot(page, 'format-selector-initial.png', {
selector: '[data-component="format-selector"]',
});
console.log(' ✓ Screenshot saved');
// Click the format selector button
console.log('\n3. Testing dropdown interaction...');
const buttonExists = await elementExists(
page,
'[data-component="format-selector"] button'
);
if (buttonExists) {
// Click button to open dropdown
await page.click('[data-component="format-selector"] button');
console.log(' ✓ Clicked format selector button');
// Wait for dropdown menu to appear
await waitForElement(
page,
'[data-component="format-selector"] [role="menu"]',
3000
);
console.log(' ✓ Dropdown menu appeared');
// Take screenshot of open dropdown
await takeScreenshot(page, 'format-selector-open.png', {
selector: '[data-component="format-selector"]',
});
console.log(' ✓ Screenshot of open dropdown saved');
// Get all format options
const options = await page.$$eval(
'[data-component="format-selector"] [role="menuitem"]',
(items) => items.map((item) => item.textContent.trim())
);
console.log(` ✓ Found ${options.length} format options:`, options);
// Test clicking each option
console.log('\n4. Testing format options...');
const menuItems = await page.$$(
'[data-component="format-selector"] [role="menuitem"]'
);
for (let i = 0; i < Math.min(menuItems.length, 3); i++) {
const option = options[i];
console.log(` Testing option: ${option}`);
// Click the format selector button again (it closes after selection)
await page.click('[data-component="format-selector"] button');
await page.waitForTimeout(300); // Wait for animation
// Click the option
await page.click(
`[data-component="format-selector"] [role="menuitem"]:nth-child(${i + 1})`
);
await page.waitForTimeout(500); // Wait for content to update
// Take screenshot of result
await takeScreenshot(
page,
`format-selector-${option.toLowerCase().replace(/\s+/g, '-')}.png`
);
console.log(` ✓ Tested ${option} format`);
}
}
// Check for JavaScript errors
console.log('\n5. Checking for JavaScript errors...');
const errors = await page.evaluate(() => {
// Check if any errors were logged
return window.__errors || [];
});
if (errors.length > 0) {
console.log(' ⚠️ Found JavaScript errors:');
errors.forEach((err) => console.log(` - ${err}`));
} else {
console.log(' ✓ No JavaScript errors detected');
}
// Get computed styles
console.log('\n6. Checking component styles...');
const styles = await page.evaluate(() => {
const selector = document.querySelector(
'[data-component="format-selector"]'
);
if (!selector) return null;
const computed = window.getComputedStyle(selector);
return {
display: computed.display,
visibility: computed.visibility,
opacity: computed.opacity,
};
});
if (styles) {
console.log(' Component styles:', styles);
console.log(' ✓ Component is visible');
}
console.log('\n✅ Format selector tests completed successfully!\n');
} catch (error) {
console.error('\n❌ Test failed:', error.message);
// Save debug output
if (browser) {
const pages = await browser.pages();
if (pages.length > 0) {
await debugPage(pages[0], 'format-selector-error');
console.log('\n💾 Debug information saved to debug-output/');
}
}
throw error;
} finally {
if (browser) {
await browser.close();
}
}
}
// Run the test
testFormatSelector().catch((error) => {
console.error('\nFatal error:', error);
process.exit(1);
});