- Add 26 documentation files including test reports, deployment guides, and troubleshooting documentation - Include 3 CSV data files for trainer imports and user registration tracking - Add 43 JavaScript test files covering mobile optimization, Safari compatibility, and E2E testing - Include 18 PHP utility files for debugging, geocoding, and data analysis - Add 12 shell scripts for deployment verification, user management, and database operations - Update .gitignore with whitelist patterns for development files, documentation, and CSV data 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
108 lines
No EOL
4.2 KiB
JavaScript
108 lines
No EOL
4.2 KiB
JavaScript
const { chromium } = require('playwright');
|
|
|
|
async function analyzeMobileIssues() {
|
|
const browser = await chromium.launch();
|
|
const context = await browser.newContext({
|
|
viewport: { width: 375, height: 812 }, // iPhone X size
|
|
userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1'
|
|
});
|
|
|
|
const page = await context.newPage();
|
|
|
|
const pages = [
|
|
'https://upskill-staging.measurequick.com/trainer/login/',
|
|
'https://upskill-staging.measurequick.com/trainer/registration/',
|
|
'https://upskill-staging.measurequick.com/trainer/dashboard/',
|
|
'https://upskill-staging.measurequick.com/trainer/profile/'
|
|
];
|
|
|
|
const issues = [];
|
|
|
|
for (const url of pages) {
|
|
try {
|
|
await page.goto(url, { waitUntil: 'networkidle' });
|
|
await page.waitForTimeout(2000);
|
|
|
|
// Take screenshot
|
|
const screenshotName = url.split('/').slice(-2).join('-').replace('/', '') || 'home';
|
|
await page.screenshot({ path: `mobile-${screenshotName}.png`, fullPage: true });
|
|
|
|
// Check for horizontal scroll
|
|
const hasHorizontalScroll = await page.evaluate(() => {
|
|
return document.body.scrollWidth > window.innerWidth;
|
|
});
|
|
|
|
// Check font sizes
|
|
const fontSizes = await page.evaluate(() => {
|
|
const elements = document.querySelectorAll('*');
|
|
const sizes = [];
|
|
elements.forEach(el => {
|
|
const fontSize = window.getComputedStyle(el).fontSize;
|
|
if (fontSize && fontSize !== '0px') {
|
|
sizes.push(parseFloat(fontSize));
|
|
}
|
|
});
|
|
return sizes.filter((size, index, arr) => arr.indexOf(size) === index).sort((a, b) => b - a);
|
|
});
|
|
|
|
// Check padding issues
|
|
const paddingIssues = await page.evaluate(() => {
|
|
const containers = document.querySelectorAll('.hvac-page-wrapper, .container, .hvac-dashboard, .hvac-form-container');
|
|
const issues = [];
|
|
containers.forEach((el, i) => {
|
|
const styles = window.getComputedStyle(el);
|
|
const paddingLeft = parseFloat(styles.paddingLeft);
|
|
const paddingRight = parseFloat(styles.paddingRight);
|
|
if (paddingLeft < 10 || paddingRight < 10) {
|
|
issues.push({
|
|
element: el.className,
|
|
paddingLeft,
|
|
paddingRight
|
|
});
|
|
}
|
|
});
|
|
return issues;
|
|
});
|
|
|
|
// Check button sizes
|
|
const buttonSizes = await page.evaluate(() => {
|
|
const buttons = document.querySelectorAll('button, input[type="submit"], .hvac-button');
|
|
const sizes = [];
|
|
buttons.forEach(btn => {
|
|
const rect = btn.getBoundingClientRect();
|
|
sizes.push({
|
|
width: rect.width,
|
|
height: rect.height,
|
|
text: btn.textContent?.trim().substring(0, 20)
|
|
});
|
|
});
|
|
return sizes;
|
|
});
|
|
|
|
issues.push({
|
|
url,
|
|
hasHorizontalScroll,
|
|
fontSizes: fontSizes.slice(0, 10),
|
|
paddingIssues,
|
|
buttonSizes: buttonSizes.filter(btn => btn.height < 44),
|
|
timestamp: new Date().toISOString()
|
|
});
|
|
|
|
} catch (error) {
|
|
issues.push({
|
|
url,
|
|
error: error.message,
|
|
timestamp: new Date().toISOString()
|
|
});
|
|
}
|
|
}
|
|
|
|
await browser.close();
|
|
|
|
console.log('Mobile Analysis Results:');
|
|
console.log(JSON.stringify(issues, null, 2));
|
|
|
|
return issues;
|
|
}
|
|
|
|
analyzeMobileIssues().catch(console.error); |