- Ajouter fallback pour Swagger UI si doc.json ne fonctionne pas - Améliorer message d'erreur avec bouton pour ouvrir Swagger UI directement - Les fonctionnalités API Keys et Usage Stats sont maintenant complètes et fonctionnelles - Tous les onglets de DeveloperPage sont maintenant implémentés
235 lines
8.8 KiB
TypeScript
235 lines
8.8 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
|
|
/**
|
|
* Test de debug pour le problème de focus sur les inputs
|
|
* Ce test capture l'état actuel et génère un rapport de debug
|
|
*/
|
|
test.describe('Debug Input Focus Issue', () => {
|
|
test.beforeEach(async ({ page }) => {
|
|
// Aller sur la page de login
|
|
await page.goto('http://localhost:5173/login');
|
|
await page.waitForLoadState('networkidle');
|
|
});
|
|
|
|
test('Debug: Vérifier les styles CSS des inputs au chargement', async ({ page }) => {
|
|
// Attendre que les inputs soient chargés
|
|
const emailInput = page.locator('input[type="email"]').first();
|
|
await expect(emailInput).toBeVisible();
|
|
|
|
// Capturer une screenshot
|
|
await page.screenshot({ path: 'test-results/debug-input-initial.png', fullPage: true });
|
|
|
|
// Vérifier les styles CSS appliqués
|
|
const emailStyles = await emailInput.evaluate((el) => {
|
|
const computed = window.getComputedStyle(el);
|
|
return {
|
|
borderColor: computed.borderColor,
|
|
outline: computed.outline,
|
|
outlineWidth: computed.outlineWidth,
|
|
boxShadow: computed.boxShadow,
|
|
ringWidth: computed.getPropertyValue('--tw-ring-width'),
|
|
classes: el.className,
|
|
hasFocus: document.activeElement === el,
|
|
};
|
|
});
|
|
|
|
console.log('📊 Styles de l\'input Email au chargement:');
|
|
console.log(JSON.stringify(emailStyles, null, 2));
|
|
|
|
// Vérifier qu'il n'y a pas de focus au chargement
|
|
expect(emailStyles.hasFocus).toBe(false);
|
|
expect(emailStyles.borderColor).not.toContain('rgb(102, 252, 241)'); // Pas de cyan
|
|
});
|
|
|
|
test('Debug: Vérifier les styles CSS au clic souris', async ({ page }) => {
|
|
const emailInput = page.locator('input[type="email"]').first();
|
|
await expect(emailInput).toBeVisible();
|
|
|
|
// Cliquer sur l'input
|
|
await emailInput.click();
|
|
await page.waitForTimeout(100); // Attendre que les styles soient appliqués
|
|
|
|
// Capturer une screenshot
|
|
await page.screenshot({ path: 'test-results/debug-input-after-click.png', fullPage: true });
|
|
|
|
// Vérifier les styles CSS après clic
|
|
const emailStyles = await emailInput.evaluate((el) => {
|
|
const computed = window.getComputedStyle(el);
|
|
return {
|
|
borderColor: computed.borderColor,
|
|
outline: computed.outline,
|
|
outlineWidth: computed.outlineWidth,
|
|
boxShadow: computed.boxShadow,
|
|
ringWidth: computed.getPropertyValue('--tw-ring-width'),
|
|
classes: el.className,
|
|
hasFocus: document.activeElement === el,
|
|
isFocusVisible: el.matches(':focus-visible'),
|
|
};
|
|
});
|
|
|
|
console.log('📊 Styles de l\'input Email après clic:');
|
|
console.log(JSON.stringify(emailStyles, null, 2));
|
|
|
|
// Vérifier qu'il n'y a pas de contour cyan au clic
|
|
const borderColorRgb = emailStyles.borderColor;
|
|
const hasCyanBorder = borderColorRgb.includes('102') && borderColorRgb.includes('252') && borderColorRgb.includes('241');
|
|
|
|
console.log(`🔍 Border color: ${borderColorRgb}`);
|
|
console.log(`🔍 Has cyan border: ${hasCyanBorder}`);
|
|
console.log(`🔍 Is focus-visible: ${emailStyles.isFocusVisible}`);
|
|
|
|
// Le border ne devrait PAS être cyan au clic (seulement au clavier)
|
|
if (hasCyanBorder && !emailStyles.isFocusVisible) {
|
|
console.error('❌ PROBLÈME DÉTECTÉ: Border cyan visible au clic souris!');
|
|
console.error(' Le fix CSS ne fonctionne pas correctement.');
|
|
}
|
|
});
|
|
|
|
test('Debug: Vérifier les styles CSS au clavier (Tab)', async ({ page }) => {
|
|
const emailInput = page.locator('input[type="email"]').first();
|
|
await expect(emailInput).toBeVisible();
|
|
|
|
// Naviguer avec Tab
|
|
await page.keyboard.press('Tab');
|
|
await page.waitForTimeout(100);
|
|
|
|
// Capturer une screenshot
|
|
await page.screenshot({ path: 'test-results/debug-input-after-tab.png', fullPage: true });
|
|
|
|
// Vérifier les styles CSS après Tab
|
|
const emailStyles = await emailInput.evaluate((el) => {
|
|
const computed = window.getComputedStyle(el);
|
|
return {
|
|
borderColor: computed.borderColor,
|
|
outline: computed.outline,
|
|
outlineWidth: computed.outlineWidth,
|
|
boxShadow: computed.boxShadow,
|
|
ringWidth: computed.getPropertyValue('--tw-ring-width'),
|
|
classes: el.className,
|
|
hasFocus: document.activeElement === el,
|
|
isFocusVisible: el.matches(':focus-visible'),
|
|
};
|
|
});
|
|
|
|
console.log('📊 Styles de l\'input Email après Tab:');
|
|
console.log(JSON.stringify(emailStyles, null, 2));
|
|
|
|
// Au clavier, le border devrait être cyan (mais discret)
|
|
const borderColorRgb = emailStyles.borderColor;
|
|
const hasCyanBorder = borderColorRgb.includes('102') && borderColorRgb.includes('252') && borderColorRgb.includes('241');
|
|
|
|
console.log(`🔍 Border color: ${borderColorRgb}`);
|
|
console.log(`🔍 Has cyan border: ${hasCyanBorder}`);
|
|
console.log(`🔍 Is focus-visible: ${emailStyles.isFocusVisible}`);
|
|
|
|
// Au clavier, le border devrait être cyan
|
|
if (emailStyles.isFocusVisible && !hasCyanBorder) {
|
|
console.warn('⚠️ Le border cyan n\'apparaît pas au clavier (focus-visible)');
|
|
}
|
|
});
|
|
|
|
test('Debug: Analyser toutes les classes CSS appliquées', async ({ page }) => {
|
|
const emailInput = page.locator('input[type="email"]').first();
|
|
await expect(emailInput).toBeVisible();
|
|
|
|
// Analyser toutes les classes et styles
|
|
const analysis = await emailInput.evaluate((el) => {
|
|
const computed = window.getComputedStyle(el);
|
|
const allStyles: Record<string, string> = {};
|
|
|
|
// Récupérer tous les styles CSS
|
|
for (let i = 0; i < computed.length; i++) {
|
|
const prop = computed[i];
|
|
allStyles[prop] = computed.getPropertyValue(prop);
|
|
}
|
|
|
|
return {
|
|
classes: el.className,
|
|
classList: Array.from(el.classList),
|
|
hasFocusClass: el.className.includes('focus:'),
|
|
hasFocusVisibleClass: el.className.includes('focus-visible:'),
|
|
inlineStyle: el.getAttribute('style'),
|
|
computedStyles: {
|
|
borderColor: computed.borderColor,
|
|
borderWidth: computed.borderWidth,
|
|
borderStyle: computed.borderStyle,
|
|
outline: computed.outline,
|
|
outlineWidth: computed.outlineWidth,
|
|
boxShadow: computed.boxShadow,
|
|
'--tw-ring-width': computed.getPropertyValue('--tw-ring-width'),
|
|
'--tw-ring-color': computed.getPropertyValue('--tw-ring-color'),
|
|
},
|
|
allStyles: Object.fromEntries(
|
|
Object.entries(allStyles).filter(([key]) =>
|
|
key.includes('border') ||
|
|
key.includes('outline') ||
|
|
key.includes('ring') ||
|
|
key.includes('shadow')
|
|
)
|
|
),
|
|
};
|
|
});
|
|
|
|
console.log('📊 Analyse complète de l\'input Email:');
|
|
console.log(JSON.stringify(analysis, null, 2));
|
|
|
|
// Vérifier si les classes problématiques sont présentes
|
|
if (analysis.hasFocusClass) {
|
|
console.warn('⚠️ Classes focus: détectées dans className:', analysis.classList.filter(c => c.includes('focus:')));
|
|
}
|
|
});
|
|
|
|
test('Debug: Vérifier que le fix CSS est chargé', async ({ page }) => {
|
|
// Vérifier que le fichier fix-input-focus.css est chargé
|
|
const stylesheets = await page.evaluate(() => {
|
|
return Array.from(document.styleSheets).map((sheet, index) => {
|
|
try {
|
|
return {
|
|
index,
|
|
href: sheet.href || 'inline',
|
|
rules: sheet.cssRules ? Array.from(sheet.cssRules).length : 0,
|
|
};
|
|
} catch (e) {
|
|
return {
|
|
index,
|
|
href: sheet.href || 'inline',
|
|
rules: 'cross-origin',
|
|
};
|
|
}
|
|
});
|
|
});
|
|
|
|
console.log('📊 Feuilles de style chargées:');
|
|
console.log(JSON.stringify(stylesheets, null, 2));
|
|
|
|
// Vérifier que fix-input-focus.css est présent
|
|
const hasFixCss = stylesheets.some(s => s.href && s.href.includes('fix-input-focus'));
|
|
console.log(`🔍 Fix CSS chargé: ${hasFixCss}`);
|
|
|
|
// Vérifier les règles CSS pour input:focus
|
|
const focusRules = await page.evaluate(() => {
|
|
const rules: Array<{ selector: string; borderColor?: string }> = [];
|
|
Array.from(document.styleSheets).forEach((sheet) => {
|
|
try {
|
|
if (sheet.cssRules) {
|
|
Array.from(sheet.cssRules).forEach((rule: any) => {
|
|
if (rule.selectorText && rule.selectorText.includes('input') && rule.selectorText.includes('focus')) {
|
|
const style = rule.style;
|
|
rules.push({
|
|
selector: rule.selectorText,
|
|
borderColor: style.borderColor || style.getPropertyValue('border-color'),
|
|
});
|
|
}
|
|
});
|
|
}
|
|
} catch (e) {
|
|
// Cross-origin stylesheet, ignorer
|
|
}
|
|
});
|
|
return rules;
|
|
});
|
|
|
|
console.log('📊 Règles CSS pour input:focus trouvées:');
|
|
console.log(JSON.stringify(focusRules, null, 2));
|
|
});
|
|
});
|