- Enhanced documentation with selector stability best practices - Added recommendations for resilient testing and deployment - Created verify-selectors.sh script to validate critical selectors pre-deployment - Added pre-deploy-validation.sh for comprehensive environment validation - Improved troubleshooting section with specific recommendations 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
179 lines
No EOL
5.8 KiB
Bash
Executable file
179 lines
No EOL
5.8 KiB
Bash
Executable file
#!/bin/bash
|
|
# verify-selectors.sh - Script to verify critical selectors before deployment
|
|
# Usage: ./bin/verify-selectors.sh [--ci] [--fix]
|
|
|
|
set -e
|
|
|
|
# Colors for output
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[0;33m'
|
|
RED='\033[0;31m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Parse arguments
|
|
CI_MODE=false
|
|
FIX_MODE=false
|
|
|
|
for arg in "$@"; do
|
|
case $arg in
|
|
--ci)
|
|
CI_MODE=true
|
|
shift
|
|
;;
|
|
--fix)
|
|
FIX_MODE=true
|
|
shift
|
|
;;
|
|
esac
|
|
done
|
|
|
|
echo -e "${GREEN}=== Selector Verification Tool ===${NC}"
|
|
echo "Checking critical selectors in the HVAC Community Events plugin..."
|
|
|
|
# Define critical pages and their selectors to verify
|
|
declare -A CRITICAL_PAGES
|
|
CRITICAL_PAGES[login]="/community-login/"
|
|
CRITICAL_PAGES[dashboard]="/hvac-dashboard/"
|
|
CRITICAL_PAGES[certificate_report]="/certificates-report/"
|
|
|
|
# Check if we're in the right directory
|
|
if [ ! -d "tests/e2e" ]; then
|
|
echo -e "${RED}Error: Please run this script from the wordpress-dev directory${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# Create screenshots directory if it doesn't exist
|
|
mkdir -p screenshots/selector-verification
|
|
|
|
# Function to verify selectors
|
|
verify_selectors() {
|
|
local page_name=$1
|
|
local page_url=$2
|
|
|
|
echo -e "\n${YELLOW}Verifying selectors for: ${page_name}${NC}"
|
|
|
|
# Run Playwright test to verify selectors
|
|
npx playwright test tests/e2e/debug-login-page.spec.ts --config=playwright.config.ts || {
|
|
echo -e "${RED}Error: Selector verification failed for ${page_name}${NC}"
|
|
|
|
if [ "$CI_MODE" = true ]; then
|
|
echo "CI mode enabled, failing build due to selector verification failure"
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$FIX_MODE" = true ]; then
|
|
echo -e "${YELLOW}Fix mode enabled, attempting to auto-fix selectors...${NC}"
|
|
# Create a debug selector test for this page if it doesn't exist
|
|
if [ ! -f "tests/e2e/debug-${page_name}-page.spec.ts" ]; then
|
|
echo "Creating debug test for ${page_name}..."
|
|
# Template for debug test
|
|
cat > "tests/e2e/debug-${page_name}-page.spec.ts" << EOF
|
|
import { test, expect } from '@playwright/test';
|
|
import { STAGING_URL } from './config/staging-config';
|
|
|
|
test('Debug ${page_name} page selectors', async ({ page }) => {
|
|
console.log('Starting ${page_name} page debug');
|
|
|
|
// Navigate to the page
|
|
await page.goto('${STAGING_URL}${page_url}', { waitUntil: 'networkidle' });
|
|
console.log(\`Current URL: \${page.url()}\`);
|
|
|
|
// Take screenshot
|
|
await page.screenshot({ path: 'screenshots/selector-verification/${page_name}-page.png' });
|
|
|
|
// Dump HTML structure
|
|
const html = await page.content();
|
|
console.log('First 500 chars of HTML:');
|
|
console.log(html.substring(0, 500));
|
|
|
|
// Look for form elements
|
|
const forms = await page.$$('form');
|
|
console.log(\`Number of forms: \${forms.length}\`);
|
|
|
|
// Output all forms
|
|
for (let i = 0; i < forms.length; i++) {
|
|
const form = forms[i];
|
|
const action = await form.evaluate(f => f.getAttribute('action') || 'No action').catch(() => 'Unknown');
|
|
const method = await form.evaluate(f => f.getAttribute('method') || 'No method').catch(() => 'Unknown');
|
|
const id = await form.evaluate(f => f.getAttribute('id') || 'No id').catch(() => 'Unknown');
|
|
const className = await form.evaluate(f => f.getAttribute('class') || 'No class').catch(() => 'Unknown');
|
|
|
|
console.log(\`\nForm #\${i+1}:\`);
|
|
console.log(\` ID: \${id}\`);
|
|
console.log(\` Class: \${className}\`);
|
|
console.log(\` Action: \${action}\`);
|
|
console.log(\` Method: \${method}\`);
|
|
|
|
// Get inputs in the form
|
|
const inputs = await form.$$('input');
|
|
console.log(\` Inputs: \${inputs.length}\`);
|
|
|
|
for (const input of inputs) {
|
|
const type = await input.evaluate(i => i.getAttribute('type') || 'No type').catch(() => 'Unknown');
|
|
const name = await input.evaluate(i => i.getAttribute('name') || 'No name').catch(() => 'Unknown');
|
|
const id = await input.evaluate(i => i.getAttribute('id') || 'No id').catch(() => 'Unknown');
|
|
console.log(\` Input: Type=\${type}, Name=\${name}, ID=\${id}\`);
|
|
}
|
|
}
|
|
|
|
// Look for buttons, links and other interactive elements
|
|
const buttons = await page.$$('button, input[type="button"], input[type="submit"]');
|
|
console.log(\`\nNumber of buttons: \${buttons.length}\`);
|
|
|
|
for (let i = 0; i < buttons.length; i++) {
|
|
const button = buttons[i];
|
|
const id = await button.evaluate(b => b.getAttribute('id') || 'No id').catch(() => 'Unknown');
|
|
const text = await button.evaluate(b => b.innerText || b.value || 'No text').catch(() => 'Unknown');
|
|
console.log(\` Button #\${i+1}: ID=\${id}, Text=\${text}\`);
|
|
}
|
|
|
|
console.log('\nDebug complete');
|
|
});
|
|
EOF
|
|
echo "Debug test created. Running the debug test..."
|
|
npx playwright test "tests/e2e/debug-${page_name}-page.spec.ts" --config=playwright.config.ts
|
|
fi
|
|
fi
|
|
|
|
return 1
|
|
}
|
|
|
|
echo -e "${GREEN}✓ Selectors verified for ${page_name}${NC}"
|
|
return 0
|
|
}
|
|
|
|
# Main verification logic
|
|
FAILURES=0
|
|
|
|
# Verify login page selectors first (most critical)
|
|
if ! verify_selectors "login" "${CRITICAL_PAGES[login]}"; then
|
|
FAILURES=$((FAILURES + 1))
|
|
fi
|
|
|
|
# Verify dashboard selectors
|
|
if ! verify_selectors "dashboard" "${CRITICAL_PAGES[dashboard]}"; then
|
|
FAILURES=$((FAILURES + 1))
|
|
fi
|
|
|
|
# Verify certificate report selectors
|
|
if ! verify_selectors "certificate_report" "${CRITICAL_PAGES[certificate_report]}"; then
|
|
FAILURES=$((FAILURES + 1))
|
|
fi
|
|
|
|
# Summary
|
|
echo -e "\n${GREEN}=== Selector Verification Summary ===${NC}"
|
|
if [ $FAILURES -eq 0 ]; then
|
|
echo -e "${GREEN}✓ All selectors verified successfully${NC}"
|
|
exit 0
|
|
else
|
|
echo -e "${RED}✗ ${FAILURES} selector verification(s) failed${NC}"
|
|
echo "Please check the debug test results and update selectors as needed"
|
|
|
|
if [ "$CI_MODE" = true ]; then
|
|
echo "CI build failed due to selector verification failures"
|
|
exit 1
|
|
fi
|
|
|
|
echo "You can run with --fix to create debug tests for failing pages"
|
|
exit 1
|
|
fi |