playwright-ai-auto-debug
Version:
Automatic Playwright test debugging with AI assistance + UI Test Coverage Analysis
273 lines (226 loc) • 10.8 kB
JavaScript
import { test, expect } from '@playwright/test';
import { globalCoverageManager } from '../lib/globalCoverageManager.js';
import { MockMCPIntegration } from '../lib/mockMCPIntegration.js';
// Настройка глобального менеджера для всех тестов
test.beforeAll(async () => {
// Инициализация глобальной сессии покрытия
globalCoverageManager.initializeGlobalSession();
console.log('🌐 Запущена глобальная сессия покрытия для всех тестов');
});
test.afterAll(async () => {
// Генерация единого отчета после всех тестов
console.log('📊 Все тесты завершены. Генерация единого отчета покрытия...');
await globalCoverageManager.saveUnifiedReport();
globalCoverageManager.cleanup();
});
test.describe('Единое покрытие UI элементов', () => {
test('Тест 1: Главная страница Playwright', async ({ page }) => {
const testName = 'Тест 1: Главная страница Playwright';
// Переход на главную страницу
await page.goto('https://playwright.dev');
await page.waitForLoadState('networkidle');
// Получение снимка через MCP
const mcpClient = new MockMCPIntegration();
const snapshot = await mcpClient.getMCPSnapshot(page, { pageName: 'playwright-homepage' });
// Регистрация элементов страницы
const elements = globalCoverageManager.registerTestPageElements(
testName,
'playwright-homepage',
snapshot
);
console.log(`📋 [${testName}] Найдено ${elements.length} элементов`);
// Взаимодействие с элементами
try {
// Клик по логотипу
const logo = await page.locator('[aria-label="Playwright logo"]').first();
if (await logo.isVisible()) {
await logo.click();
globalCoverageManager.markTestElementCovered(testName, {
type: 'link',
text: 'Playwright logo',
selector: '[aria-label="Playwright logo"]'
}, 'click');
}
} catch (error) {
console.log('⚠️ Не удалось кликнуть по логотипу');
}
try {
// Клик по кнопке "Get started"
const getStartedBtn = await page.locator('text="Get started"').first();
if (await getStartedBtn.isVisible()) {
await getStartedBtn.click();
globalCoverageManager.markTestElementCovered(testName, {
type: 'button',
text: 'Get started',
selector: 'text="Get started"'
}, 'click');
// Ожидание загрузки страницы документации
await page.waitForLoadState('networkidle');
}
} catch (error) {
console.log('⚠️ Не удалось кликнуть по "Get started"');
}
// Завершение теста
globalCoverageManager.completeTest(testName, 'passed');
});
test('Тест 2: Страница документации', async ({ page }) => {
const testName = 'Тест 2: Страница документации';
// Переход на страницу документации
await page.goto('https://playwright.dev/docs/intro');
await page.waitForLoadState('networkidle');
// Получение снимка через MCP
const mcpClient = new MockMCPIntegration();
const snapshot = await mcpClient.getMCPSnapshot(page, { pageName: 'playwright-docs' });
// Регистрация элементов страницы
const elements = globalCoverageManager.registerTestPageElements(
testName,
'playwright-docs',
snapshot
);
console.log(`📋 [${testName}] Найдено ${elements.length} элементов`);
// Взаимодействие с элементами
try {
// Клик по ссылке в навигации
const installationLink = await page.locator('text="Installation"').first();
if (await installationLink.isVisible()) {
await installationLink.click();
globalCoverageManager.markTestElementCovered(testName, {
type: 'link',
text: 'Installation',
selector: 'text="Installation"'
}, 'click');
await page.waitForTimeout(1000);
}
} catch (error) {
console.log('⚠️ Не удалось кликнуть по ссылке Installation');
}
try {
// Поиск по документации
const searchInput = await page.locator('[placeholder*="Search"]').first();
if (await searchInput.isVisible()) {
await searchInput.fill('test');
globalCoverageManager.markTestElementCovered(testName, {
type: 'input',
text: 'Search',
selector: '[placeholder*="Search"]'
}, 'fill');
await page.waitForTimeout(1000);
}
} catch (error) {
console.log('⚠️ Не удалось найти поле поиска');
}
// Завершение теста
globalCoverageManager.completeTest(testName, 'passed');
});
test('Тест 3: API документация', async ({ page }) => {
const testName = 'Тест 3: API документация';
// Переход на страницу API
await page.goto('https://playwright.dev/docs/api/class-page');
await page.waitForLoadState('networkidle');
// Получение снимка через MCP
const mcpClient = new MockMCPIntegration();
const snapshot = await mcpClient.getMCPSnapshot(page, { pageName: 'playwright-api' });
// Регистрация элементов страницы
const elements = globalCoverageManager.registerTestPageElements(
testName,
'playwright-api',
snapshot
);
console.log(`📋 [${testName}] Найдено ${elements.length} элементов`);
// Взаимодействие с элементами
try {
// Раскрытие секции методов
const methodToggle = await page.locator('[data-toggle="collapse"]').first();
if (await methodToggle.isVisible()) {
await methodToggle.click();
globalCoverageManager.markTestElementCovered(testName, {
type: 'button',
text: 'Method toggle',
selector: '[data-toggle="collapse"]'
}, 'click');
}
} catch (error) {
console.log('⚠️ Не удалось раскрыть секцию методов');
}
// Завершение теста с неудачей для демонстрации
globalCoverageManager.completeTest(testName, 'failed');
});
test('Тест 4: Примеры кода', async ({ page }) => {
const testName = 'Тест 4: Примеры кода';
// Переход на страницу с примерами
await page.goto('https://playwright.dev/docs/writing-tests');
await page.waitForLoadState('networkidle');
// Получение снимка через MCP
const mcpClient = new MockMCPIntegration();
const snapshot = await mcpClient.getMCPSnapshot(page, { pageName: 'playwright-examples' });
// Регистрация элементов страницы
const elements = globalCoverageManager.registerTestPageElements(
testName,
'playwright-examples',
snapshot
);
console.log(`📋 [${testName}] Найдено ${elements.length} элементов`);
// Множественные взаимодействия для демонстрации высокого покрытия
const interactions = [
{ selector: 'h1', type: 'heading', action: 'hover' },
{ selector: 'code', type: 'code', action: 'click' },
{ selector: '[role="tab"]', type: 'tab', action: 'click' },
{ selector: 'button', type: 'button', action: 'click' },
{ selector: 'a[href*="github"]', type: 'link', action: 'hover' }
];
for (const interaction of interactions) {
try {
const element = await page.locator(interaction.selector).first();
if (await element.isVisible()) {
if (interaction.action === 'click') {
await element.click();
} else if (interaction.action === 'hover') {
await element.hover();
}
globalCoverageManager.markTestElementCovered(testName, {
type: interaction.type,
text: interaction.selector,
selector: interaction.selector
}, interaction.action);
await page.waitForTimeout(500);
}
} catch (error) {
console.log(`⚠️ Не удалось выполнить ${interaction.action} для ${interaction.selector}`);
}
}
// Завершение теста
globalCoverageManager.completeTest(testName, 'passed');
});
test('Тест 5: Конфигурация', async ({ page }) => {
const testName = 'Тест 5: Конфигурация';
// Переход на страницу конфигурации
await page.goto('https://playwright.dev/docs/test-configuration');
await page.waitForLoadState('networkidle');
// Получение снимка через MCP
const mcpClient = new MockMCPIntegration();
const snapshot = await mcpClient.getMCPSnapshot(page, { pageName: 'playwright-config' });
// Регистрация элементов страницы
const elements = globalCoverageManager.registerTestPageElements(
testName,
'playwright-config',
snapshot
);
console.log(`📋 [${testName}] Найдено ${elements.length} элементов`);
// Минимальное взаимодействие для демонстрации низкого покрытия
try {
const heading = await page.locator('h1').first();
if (await heading.isVisible()) {
await heading.hover();
globalCoverageManager.markTestElementCovered(testName, {
type: 'heading',
text: 'Configuration',
selector: 'h1'
}, 'hover');
}
} catch (error) {
console.log('⚠️ Не удалось выполнить взаимодействие с заголовком');
}
// Завершение теста
globalCoverageManager.completeTest(testName, 'passed');
});
});