@silasfmartins/testhub 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/copilot-instructions.md +520 -0
- package/biome.json +37 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.js +169 -0
- package/dist/scripts/consumer-postinstall.d.ts +15 -0
- package/dist/scripts/consumer-postinstall.js +785 -0
- package/dist/scripts/generate-docs.d.ts +16 -0
- package/dist/scripts/generate-docs.js +1363 -0
- package/dist/scripts/generate-index.d.ts +2 -0
- package/dist/scripts/generate-index.js +314 -0
- package/dist/scripts/init-api.d.ts +2 -0
- package/dist/scripts/init-api.js +525 -0
- package/dist/scripts/init-banco.d.ts +2 -0
- package/dist/scripts/init-banco.js +347 -0
- package/dist/scripts/init-frontend.d.ts +2 -0
- package/dist/scripts/init-frontend.js +627 -0
- package/dist/scripts/init-mobile.d.ts +2 -0
- package/dist/scripts/init-mobile.js +481 -0
- package/dist/scripts/init-scenarios.d.ts +2 -0
- package/dist/scripts/init-scenarios.js +846 -0
- package/dist/scripts/init-ssh.d.ts +2 -0
- package/dist/scripts/init-ssh.js +639 -0
- package/dist/scripts/package-versions.d.ts +57 -0
- package/dist/scripts/package-versions.js +768 -0
- package/dist/scripts/postinstall.d.ts +1 -0
- package/dist/scripts/postinstall.js +527 -0
- package/dist/scripts/robust-build.d.ts +7 -0
- package/dist/scripts/robust-build.js +88 -0
- package/dist/scripts/setup-local-packages.d.ts +31 -0
- package/dist/scripts/setup-local-packages.js +237 -0
- package/dist/scripts/smart-override.d.ts +2 -0
- package/dist/scripts/smart-override.js +1360 -0
- package/dist/scripts/sync-configs.d.ts +27 -0
- package/dist/scripts/sync-configs.js +248 -0
- package/dist/scripts/test-biome-parse.d.ts +5 -0
- package/dist/scripts/test-biome-parse.js +84 -0
- package/dist/scripts/ultracite-setup.d.ts +4 -0
- package/dist/scripts/ultracite-setup.js +310 -0
- package/dist/scripts/update-all-init-scripts.d.ts +2 -0
- package/dist/scripts/update-all-init-scripts.js +52 -0
- package/dist/scripts/update-biome-schema.d.ts +15 -0
- package/dist/scripts/update-biome-schema.js +124 -0
- package/dist/src/AutoCoreFacade.d.ts +145 -0
- package/dist/src/AutoCoreFacade.js +217 -0
- package/dist/src/api/ApiActions.d.ts +297 -0
- package/dist/src/api/ApiActions.js +1905 -0
- package/dist/src/api/Certificate.d.ts +60 -0
- package/dist/src/api/Certificate.js +79 -0
- package/dist/src/api/JsonResponse.d.ts +116 -0
- package/dist/src/api/JsonResponse.js +206 -0
- package/dist/src/appium/DeviceFarmViewer.d.ts +79 -0
- package/dist/src/appium/DeviceFarmViewer.js +1083 -0
- package/dist/src/appium/MobileActions.d.ts +347 -0
- package/dist/src/appium/MobileActions.js +1632 -0
- package/dist/src/appium/MobileConnection.d.ts +160 -0
- package/dist/src/appium/MobileConnection.js +772 -0
- package/dist/src/config/envLoader.d.ts +123 -0
- package/dist/src/config/envLoader.js +361 -0
- package/dist/src/config/jest-safe-setup.d.ts +19 -0
- package/dist/src/config/jest-safe-setup.js +369 -0
- package/dist/src/config/timeouts.d.ts +32 -0
- package/dist/src/config/timeouts.js +38 -0
- package/dist/src/desktop/DesktopActions.d.ts +46 -0
- package/dist/src/desktop/DesktopActions.js +398 -0
- package/dist/src/desktop/DesktopConnection.d.ts +32 -0
- package/dist/src/desktop/DesktopConnection.js +84 -0
- package/dist/src/domain/entities/TestExecution.d.ts +117 -0
- package/dist/src/domain/entities/TestExecution.js +150 -0
- package/dist/src/domain/entities/TestReport.d.ts +114 -0
- package/dist/src/domain/entities/TestReport.js +179 -0
- package/dist/src/domain/repositories/ITestRepository.d.ts +196 -0
- package/dist/src/domain/repositories/ITestRepository.js +14 -0
- package/dist/src/domain/schemas/ValidationSchemas.d.ts +159 -0
- package/dist/src/domain/schemas/ValidationSchemas.js +181 -0
- package/dist/src/functions/errors/BaseError.d.ts +78 -0
- package/dist/src/functions/errors/BaseError.js +245 -0
- package/dist/src/functions/errors/ConfigurationError.d.ts +16 -0
- package/dist/src/functions/errors/ConfigurationError.js +48 -0
- package/dist/src/functions/errors/ErrorCatalog.d.ts +148 -0
- package/dist/src/functions/errors/ErrorCatalog.js +157 -0
- package/dist/src/functions/errors/GlobalErrorHandler.d.ts +101 -0
- package/dist/src/functions/errors/GlobalErrorHandler.js +281 -0
- package/dist/src/functions/errors/IntegrationError.d.ts +17 -0
- package/dist/src/functions/errors/IntegrationError.js +51 -0
- package/dist/src/functions/errors/SecurityError.d.ts +14 -0
- package/dist/src/functions/errors/SecurityError.js +42 -0
- package/dist/src/functions/errors/SystemError.d.ts +12 -0
- package/dist/src/functions/errors/SystemError.js +36 -0
- package/dist/src/functions/errors/ValidationError.d.ts +14 -0
- package/dist/src/functions/errors/ValidationError.js +61 -0
- package/dist/src/functions/errors/index.d.ts +12 -0
- package/dist/src/functions/errors/index.js +13 -0
- package/dist/src/global-setup.d.ts +1 -0
- package/dist/src/global-setup.js +1037 -0
- package/dist/src/helpers/BancoActions.d.ts +188 -0
- package/dist/src/helpers/BancoActions.js +581 -0
- package/dist/src/helpers/EnviromentHelper.d.ts +17 -0
- package/dist/src/helpers/EnviromentHelper.js +66 -0
- package/dist/src/helpers/ParallelExecutionHelper.d.ts +183 -0
- package/dist/src/helpers/ParallelExecutionHelper.js +375 -0
- package/dist/src/helpers/SyncSignal.d.ts +15 -0
- package/dist/src/helpers/SyncSignal.js +44 -0
- package/dist/src/hubdocs/CategoryDetector.d.ts +83 -0
- package/dist/src/hubdocs/CategoryDetector.js +401 -0
- package/dist/src/hubdocs/DirectStatementInterceptor.d.ts +54 -0
- package/dist/src/hubdocs/DirectStatementInterceptor.js +243 -0
- package/dist/src/hubdocs/ExecutionTracker.d.ts +107 -0
- package/dist/src/hubdocs/ExecutionTracker.js +702 -0
- package/dist/src/hubdocs/HubDocs.d.ts +395 -0
- package/dist/src/hubdocs/HubDocs.js +3586 -0
- package/dist/src/hubdocs/StatementMethodFilter.d.ts +71 -0
- package/dist/src/hubdocs/StatementMethodFilter.js +618 -0
- package/dist/src/hubdocs/StatementTracker.d.ts +417 -0
- package/dist/src/hubdocs/StatementTracker.js +2419 -0
- package/dist/src/hubdocs/SwaggerGenerator.d.ts +59 -0
- package/dist/src/hubdocs/SwaggerGenerator.js +405 -0
- package/dist/src/hubdocs/index.d.ts +9 -0
- package/dist/src/hubdocs/index.js +9 -0
- package/dist/src/hubdocs/types.d.ts +114 -0
- package/dist/src/hubdocs/types.js +5 -0
- package/dist/src/infrastructure/DependencyContainer.d.ts +142 -0
- package/dist/src/infrastructure/DependencyContainer.js +250 -0
- package/dist/src/infrastructure/adapters/AppiumAdapter.d.ts +168 -0
- package/dist/src/infrastructure/adapters/AppiumAdapter.js +468 -0
- package/dist/src/infrastructure/adapters/OracleAdapter.d.ts +150 -0
- package/dist/src/infrastructure/adapters/OracleAdapter.js +388 -0
- package/dist/src/infrastructure/adapters/PlaywrightAdapter.d.ts +192 -0
- package/dist/src/infrastructure/adapters/PlaywrightAdapter.js +382 -0
- package/dist/src/infrastructure/adapters/SSHAdapter.d.ts +141 -0
- package/dist/src/infrastructure/adapters/SSHAdapter.js +428 -0
- package/dist/src/interfaces.d.ts +501 -0
- package/dist/src/interfaces.js +25 -0
- package/dist/src/internal/fakes/__fake-actions__.d.ts +17 -0
- package/dist/src/internal/fakes/__fake-actions__.js +21 -0
- package/dist/src/internal/fakes/__forbidden__.d.ts +10 -0
- package/dist/src/internal/fakes/__forbidden__.js +18 -0
- package/dist/src/internal/fakes/__honeypot__.d.ts +15 -0
- package/dist/src/internal/fakes/__honeypot__.js +24 -0
- package/dist/src/octane/OctaneReporter.d.ts +13 -0
- package/dist/src/octane/OctaneReporter.js +61 -0
- package/dist/src/playwright/CryptoActions.d.ts +20 -0
- package/dist/src/playwright/CryptoActions.js +75 -0
- package/dist/src/playwright/EnhancedWebActions.d.ts +7 -0
- package/dist/src/playwright/EnhancedWebActions.js +65 -0
- package/dist/src/playwright/WebActions.d.ts +1599 -0
- package/dist/src/playwright/WebActions.js +11788 -0
- package/dist/src/playwright/actions/ActionTimeline.d.ts +36 -0
- package/dist/src/playwright/actions/ActionTimeline.js +101 -0
- package/dist/src/playwright/actions/RecoveryQueue.d.ts +82 -0
- package/dist/src/playwright/actions/RecoveryQueue.js +130 -0
- package/dist/src/playwright/actions/SelectorCache.d.ts +53 -0
- package/dist/src/playwright/actions/SelectorCache.js +96 -0
- package/dist/src/playwright/actions/index.d.ts +13 -0
- package/dist/src/playwright/actions/index.js +14 -0
- package/dist/src/playwright/actions/types.d.ts +147 -0
- package/dist/src/playwright/actions/types.js +5 -0
- package/dist/src/playwright/fixtures.d.ts +112 -0
- package/dist/src/playwright/fixtures.js +718 -0
- package/dist/src/playwright/network-logs-reporter.d.ts +7 -0
- package/dist/src/playwright/network-logs-reporter.js +66 -0
- package/dist/src/playwright/registerRecoveryWrappers.d.ts +1 -0
- package/dist/src/playwright/registerRecoveryWrappers.js +54 -0
- package/dist/src/security/BuildSecurity.d.ts +12 -0
- package/dist/src/security/BuildSecurity.js +138 -0
- package/dist/src/security/EulaProtection.d.ts +70 -0
- package/dist/src/security/EulaProtection.js +155 -0
- package/dist/src/security/HoneypotManager.d.ts +46 -0
- package/dist/src/security/HoneypotManager.js +234 -0
- package/dist/src/security/KeysManager.d.ts +36 -0
- package/dist/src/security/KeysManager.js +158 -0
- package/dist/src/security/ProofOfWorkIntegration.d.ts +64 -0
- package/dist/src/security/ProofOfWorkIntegration.js +206 -0
- package/dist/src/security/SecurityValidation.d.ts +21 -0
- package/dist/src/security/SecurityValidation.js +163 -0
- package/dist/src/security/SourceMapProtection.d.ts +55 -0
- package/dist/src/security/SourceMapProtection.js +220 -0
- package/dist/src/security/protector.d.ts +1 -0
- package/dist/src/security/protector.js +97 -0
- package/dist/src/ssh/SSHActions.d.ts +262 -0
- package/dist/src/ssh/SSHActions.js +790 -0
- package/dist/src/ssh/SSHClient.d.ts +99 -0
- package/dist/src/ssh/SSHClient.js +409 -0
- package/dist/src/statements/BaseStatement.d.ts +38 -0
- package/dist/src/statements/BaseStatement.js +78 -0
- package/dist/src/testContext/AuthStateManager.d.ts +93 -0
- package/dist/src/testContext/AuthStateManager.js +256 -0
- package/dist/src/testContext/CoverageManager.d.ts +198 -0
- package/dist/src/testContext/CoverageManager.js +917 -0
- package/dist/src/testContext/TestAnnotations.d.ts +476 -0
- package/dist/src/testContext/TestAnnotations.js +2647 -0
- package/dist/src/testContext/TestContext.d.ts +138 -0
- package/dist/src/testContext/TestContext.js +369 -0
- package/dist/src/testContext/UnifiedHtmlGenerator.d.ts +7 -0
- package/dist/src/testContext/UnifiedHtmlGenerator.js +264 -0
- package/dist/src/testContext/UnifiedReportManager.d.ts +211 -0
- package/dist/src/testContext/UnifiedReportManager.js +1206 -0
- package/dist/src/testhub/DynamicConfigManager.d.ts +121 -0
- package/dist/src/testhub/DynamicConfigManager.js +320 -0
- package/dist/src/testhub/SystemsManager.d.ts +119 -0
- package/dist/src/testhub/SystemsManager.js +365 -0
- package/dist/src/testhub/TestHubClient.d.ts +335 -0
- package/dist/src/testhub/TestHubClient.js +1215 -0
- package/dist/src/testhub/TestHubReporter.d.ts +62 -0
- package/dist/src/testhub/TestHubReporter.js +576 -0
- package/dist/src/testhub/TestHubVars.d.ts +116 -0
- package/dist/src/testhub/TestHubVars.js +273 -0
- package/dist/src/utils/ActionInterceptor.d.ts +59 -0
- package/dist/src/utils/ActionInterceptor.js +741 -0
- package/dist/src/utils/ArtifactsCompressor.d.ts +43 -0
- package/dist/src/utils/ArtifactsCompressor.js +181 -0
- package/dist/src/utils/AutoLogsFinal.d.ts +47 -0
- package/dist/src/utils/AutoLogsFinal.js +148 -0
- package/dist/src/utils/CodeGenSession.d.ts +114 -0
- package/dist/src/utils/CodeGenSession.js +264 -0
- package/dist/src/utils/ConfigLogger.d.ts +133 -0
- package/dist/src/utils/ConfigLogger.js +611 -0
- package/dist/src/utils/CustomReporter.d.ts +22 -0
- package/dist/src/utils/CustomReporter.js +352 -0
- package/dist/src/utils/DataStore.d.ts +171 -0
- package/dist/src/utils/DataStore.js +484 -0
- package/dist/src/utils/DatabaseInterceptor.d.ts +19 -0
- package/dist/src/utils/DatabaseInterceptor.js +295 -0
- package/dist/src/utils/DateHelper.d.ts +16 -0
- package/dist/src/utils/DateHelper.js +120 -0
- package/dist/src/utils/DateValidator.d.ts +4 -0
- package/dist/src/utils/DateValidator.js +51 -0
- package/dist/src/utils/DocumentGenerator.d.ts +35 -0
- package/dist/src/utils/DocumentGenerator.js +129 -0
- package/dist/src/utils/EvidenceCapture.d.ts +90 -0
- package/dist/src/utils/EvidenceCapture.js +600 -0
- package/dist/src/utils/EvidenceReportGenerator.d.ts +70 -0
- package/dist/src/utils/EvidenceReportGenerator.js +799 -0
- package/dist/src/utils/FrameManagementUtil.d.ts +42 -0
- package/dist/src/utils/FrameManagementUtil.js +75 -0
- package/dist/src/utils/GlobalStatementsInterceptor.d.ts +1 -0
- package/dist/src/utils/GlobalStatementsInterceptor.js +1 -0
- package/dist/src/utils/HTMLTemplate.d.ts +1 -0
- package/dist/src/utils/HTMLTemplate.js +1034 -0
- package/dist/src/utils/InterceptacaoMagica.d.ts +23 -0
- package/dist/src/utils/InterceptacaoMagica.js +365 -0
- package/dist/src/utils/LogSanitizer.d.ts +35 -0
- package/dist/src/utils/LogSanitizer.js +110 -0
- package/dist/src/utils/Logger.d.ts +65 -0
- package/dist/src/utils/Logger.js +284 -0
- package/dist/src/utils/McpLocalClient.d.ts +141 -0
- package/dist/src/utils/McpLocalClient.js +871 -0
- package/dist/src/utils/PDFEvidenceGenerator.d.ts +20 -0
- package/dist/src/utils/PDFEvidenceGenerator.js +156 -0
- package/dist/src/utils/SpecFileAnalyzer.d.ts +35 -0
- package/dist/src/utils/SpecFileAnalyzer.js +209 -0
- package/dist/src/utils/StatementInterceptor.d.ts +18 -0
- package/dist/src/utils/StatementInterceptor.js +87 -0
- package/dist/src/utils/StatementLogger.d.ts +33 -0
- package/dist/src/utils/StatementLogger.js +113 -0
- package/dist/src/utils/StatementsInterceptor.d.ts +1 -0
- package/dist/src/utils/StatementsInterceptor.js +1 -0
- package/dist/src/utils/TeamsFlushHook.d.ts +17 -0
- package/dist/src/utils/TeamsFlushHook.js +168 -0
- package/dist/src/utils/TerminalLogCapture.d.ts +158 -0
- package/dist/src/utils/TerminalLogCapture.js +531 -0
- package/dist/src/utils/TestMethodLogger.d.ts +70 -0
- package/dist/src/utils/TestMethodLogger.js +95 -0
- package/dist/src/utils/UnifiedTeardown.d.ts +4 -0
- package/dist/src/utils/UnifiedTeardown.js +400 -0
- package/dist/src/utils/XPathCatalog.d.ts +152 -0
- package/dist/src/utils/XPathCatalog.js +350 -0
- package/dist/src/utils/generators.d.ts +90 -0
- package/dist/src/utils/generators.js +167 -0
- package/dist/src/utils/testRecovery/ResilientPlaywright.d.ts +152 -0
- package/dist/src/utils/testRecovery/ResilientPlaywright.js +715 -0
- package/dist/src/utils/testRecovery/TestRecoveryClient.d.ts +801 -0
- package/dist/src/utils/testRecovery/TestRecoveryClient.js +1415 -0
- package/dist/src/utils/testRecovery/autoFixCode.d.ts +65 -0
- package/dist/src/utils/testRecovery/autoFixCode.js +32 -0
- package/dist/vitest.config.d.ts +2 -0
- package/dist/vitest.config.js +59 -0
- package/dist/wdio.conf.d.ts +1 -0
- package/dist/wdio.conf.js +420 -0
- package/package.json +137 -0
- package/protect-loader.mjs +643 -0
- package/scripts/consumer-postinstall.ts +975 -0
- package/scripts/generate-index.ts +343 -0
- package/scripts/init-api.ts +613 -0
- package/scripts/init-banco.ts +437 -0
- package/scripts/init-frontend.ts +727 -0
- package/scripts/init-mobile.ts +558 -0
- package/scripts/init-scenarios.ts +925 -0
- package/scripts/init-ssh.ts +734 -0
- package/scripts/package-versions.ts +978 -0
- package/scripts/postinstall.ts +605 -0
- package/scripts/smart-override.ts +1675 -0
- package/scripts/sync-configs.ts +302 -0
- package/scripts/ultracite-setup.ts +370 -0
- package/src/types/globals.d.ts +48 -0
- package/tsconfig.json +29 -0
- package/types/autocore-sync-signal.d.ts +10 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { ApiActions } from '../api/ApiActions.js';
|
|
4
|
+
import { MobileConnection } from '../appium/MobileConnection.js';
|
|
5
|
+
import { cleanupEnvLock } from '../config/envLoader.js';
|
|
6
|
+
import { BancoActions } from '../helpers/BancoActions.js';
|
|
7
|
+
import { saveReport, sendReportToOctane } from '../octane/OctaneReporter.js';
|
|
8
|
+
import { SSHActions } from '../ssh/SSHActions.js';
|
|
9
|
+
import { SSHClient } from '../ssh/SSHClient.js';
|
|
10
|
+
import { TestContext } from '../testContext/TestContext.js';
|
|
11
|
+
import { UnifiedReportManager } from '../testContext/UnifiedReportManager.js';
|
|
12
|
+
import { ConfigLogger } from './ConfigLogger.js';
|
|
13
|
+
import { DataStore } from './DataStore.js';
|
|
14
|
+
import { Logger } from './Logger.js';
|
|
15
|
+
import { StatementTracker } from '../hubdocs/StatementTracker.js';
|
|
16
|
+
import { EvidenceReportGenerator } from './EvidenceReportGenerator.js';
|
|
17
|
+
import TestHubReporter from '../testhub/TestHubReporter.js';
|
|
18
|
+
import { teamsFlushAfterExecution } from './TeamsFlushHook.js';
|
|
19
|
+
// 🔒 Flag para controlar se o envio para o Hub foi completado
|
|
20
|
+
let hubSendCompleted = false;
|
|
21
|
+
// Utilitário para log estilo Java
|
|
22
|
+
function javaStyleLog(context, message, level = 'INFO') {
|
|
23
|
+
const now = new Date();
|
|
24
|
+
const date = now
|
|
25
|
+
.toLocaleDateString('en-US', {
|
|
26
|
+
month: 'short',
|
|
27
|
+
day: '2-digit',
|
|
28
|
+
year: 'numeric',
|
|
29
|
+
})
|
|
30
|
+
.replace(',', '');
|
|
31
|
+
const time = now.toLocaleTimeString('en-US', { hour12: true });
|
|
32
|
+
// Exemplo: jul 08, 2025 9:45:44 AM OctaneManager
|
|
33
|
+
Logger.info(`${date} ${time} ${context}\n${level}: ${message}`);
|
|
34
|
+
}
|
|
35
|
+
export class UnifiedTeardown {
|
|
36
|
+
static async run() {
|
|
37
|
+
Logger.info('🏁 Iniciando teardown global...');
|
|
38
|
+
const projectType = process.env.PROJECT_TYPE || 'Desconhecido';
|
|
39
|
+
try {
|
|
40
|
+
// 📋 CRÍTICO: Salvar logs do terminal ANTES de finalizar
|
|
41
|
+
Logger.info('📋 Salvando logs do terminal...');
|
|
42
|
+
try {
|
|
43
|
+
if (globalThis.TerminalLogCapture) {
|
|
44
|
+
const logCapture = globalThis.TerminalLogCapture;
|
|
45
|
+
logCapture.saveToFile();
|
|
46
|
+
const stats = logCapture.getStats();
|
|
47
|
+
Logger.success(`Logs salvos: ${stats.totalLogs} total, ${stats.testsWithLogs} teste(s) com logs`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
Logger.warning(`⚠️ Erro ao salvar logs do terminal: ${error}`);
|
|
52
|
+
}
|
|
53
|
+
// 🆕 CRÍTICO: Apenas salvar dados finais - CustomReporter já finalizou os CTs
|
|
54
|
+
Logger.info('🏁 Finalizando captura de CTs...');
|
|
55
|
+
try {
|
|
56
|
+
// ✅ Apenas salvar - NÃO refinalizar CTs que já foram finalizados pelo CustomReporter
|
|
57
|
+
await StatementTracker.finalize();
|
|
58
|
+
Logger.success('StatementTracker finalizado com sucesso');
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
Logger.warning(`⚠️ Erro ao finalizar StatementTracker: ${error}`);
|
|
62
|
+
}
|
|
63
|
+
// ✅ APENAS FINALIZAR MÉTRICAS se ainda não foi finalizado
|
|
64
|
+
Logger.info('📊 Finalizando sistema de relatórios unificado...');
|
|
65
|
+
UnifiedReportManager.registrarFimExecucao();
|
|
66
|
+
const metrics = UnifiedReportManager.getMetrics();
|
|
67
|
+
if (metrics.totalTestes > 0) {
|
|
68
|
+
Logger.info(`📋 Execução concluída: ${metrics.totalTestes} teste(s)`);
|
|
69
|
+
// ✅ NOVO: Gerar relatório geral unificado
|
|
70
|
+
Logger.info('📄 Gerando relatório geral unificado...');
|
|
71
|
+
await UnifiedReportManager.anexarRelatorioGeral();
|
|
72
|
+
await EvidenceReportGenerator.generateEvidenceReport();
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
Logger.info('ℹ️ Nenhum teste registrado');
|
|
76
|
+
}
|
|
77
|
+
// 🌐 Enviar resultados para AutoCore Hub
|
|
78
|
+
try {
|
|
79
|
+
Logger.info('🌐 Enviando resultados para AutoCore Hub...');
|
|
80
|
+
const reporter = new TestHubReporter();
|
|
81
|
+
// Enviar todos os resultados coletados em formato batch
|
|
82
|
+
await reporter.sendAllResults();
|
|
83
|
+
// ✅ CRÍTICO: Marcar envio como completado
|
|
84
|
+
hubSendCompleted = true;
|
|
85
|
+
// ✅ CRÍTICO: Aguardar para garantir que o envio HTTP foi completado
|
|
86
|
+
// Isso é especialmente importante no modo UI onde o processo pode terminar rapidamente
|
|
87
|
+
Logger.info('⏳ Aguardando confirmação de envio para o Hub...');
|
|
88
|
+
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
89
|
+
Logger.success('Envio para AutoCore Hub confirmado!');
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
Logger.warning(`⚠️ Erro ao enviar resultados para AutoCore Hub: ${error}`);
|
|
93
|
+
Logger.warning(' Os testes foram executados normalmente, mas o envio falhou');
|
|
94
|
+
Logger.warning(' Verifique a conectividade com o backend AutoCore Hub');
|
|
95
|
+
}
|
|
96
|
+
// Envio para Octane/ALM se habilitado e variáveis obrigatórias presentes
|
|
97
|
+
if (process.env.ALM_ENABLE === 'true') {
|
|
98
|
+
const almHost = process.env.ALM_HOST;
|
|
99
|
+
const almDomain = process.env.ALM_DOMAIN;
|
|
100
|
+
const almProject = process.env.ALM_PROJECT;
|
|
101
|
+
const user = process.env.USER;
|
|
102
|
+
const password = process.env.PASSWORD;
|
|
103
|
+
const almTestRootPath = process.env.ALM_TEST_ROOT_PATH || '';
|
|
104
|
+
// Log estilo Java
|
|
105
|
+
Logger.info('########################################');
|
|
106
|
+
Logger.info('#');
|
|
107
|
+
Logger.info('#');
|
|
108
|
+
javaStyleLog('OctaneManager', 'INICIANDO API DO OCTANE');
|
|
109
|
+
Logger.info('#');
|
|
110
|
+
Logger.info('#');
|
|
111
|
+
Logger.info('########################################');
|
|
112
|
+
javaStyleLog('OctaneManager', `SERVER OCTANE: https://${almHost}`);
|
|
113
|
+
javaStyleLog('OctaneManager', `SHAREDSPACE OCTANE: ${almDomain}`);
|
|
114
|
+
javaStyleLog('OctaneManager', `WORKSPACE OCTANE: ${almProject}`);
|
|
115
|
+
if (almHost && almDomain && almProject && user && password) {
|
|
116
|
+
try {
|
|
117
|
+
javaStyleLog('OctaneManager', '[SUCCESS] Informações de conexão capturadas');
|
|
118
|
+
const octaneUrl = `https://${almHost}/api/shared_spaces/${almDomain}/workspaces/${encodeURIComponent(almProject)}/test-results${almTestRootPath ? `?rootPath=${encodeURIComponent(almTestRootPath)}` : ''}`;
|
|
119
|
+
saveReport();
|
|
120
|
+
const decodedPassword = Buffer.from(password, 'base64').toString('utf-8');
|
|
121
|
+
await sendReportToOctane(octaneUrl, user, decodedPassword);
|
|
122
|
+
javaStyleLog('OctaneManager', '[SUCCESS] Relatório enviado ao Octane/ALM');
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
javaStyleLog('OctaneManager', '[ERROR] Ocorreu um erro ao gerar o relatório', 'ERROR');
|
|
126
|
+
if (error instanceof Error) {
|
|
127
|
+
javaStyleLog('OctaneManager', error.stack || error.message, 'ERROR');
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
javaStyleLog('OctaneManager', String(error), 'ERROR');
|
|
131
|
+
}
|
|
132
|
+
javaStyleLog('OctaneManager', `❌ Falha ao enviar relatório ao Octane/ALM: ${String(error)}`, 'ERROR');
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
javaStyleLog('OctaneManager', '⚠️ Variáveis de ambiente obrigatórias para ALM/Octane não preenchidas. Envio não realizado.', 'ERROR');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
javaStyleLog('controllers.OctaneManager', 'Integração ALM/Octane desabilitada (ALM_ENABLE=false)');
|
|
141
|
+
}
|
|
142
|
+
await projectSpecificCleanup(projectType);
|
|
143
|
+
await globalCleanup();
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
javaStyleLog('controllers.OctaneManager', `❌ Erro durante teardown global: ${String(error)}`, 'ERROR');
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
// 📨 Teams relay flush obrigatório no fim de cada execução (v2.7.44 - item 13)
|
|
150
|
+
// Sempre roda em finally (passou/falhou) para garantir envio de notificações
|
|
151
|
+
try {
|
|
152
|
+
await teamsFlushAfterExecution(50);
|
|
153
|
+
}
|
|
154
|
+
catch (flushErr) {
|
|
155
|
+
Logger.warning(`[UnifiedTeardown] ⚠️ Teams flush falhou: ${String(flushErr)}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async function projectSpecificCleanup(projectType) {
|
|
161
|
+
switch (projectType) {
|
|
162
|
+
case 'Mobile':
|
|
163
|
+
await cleanupMobile();
|
|
164
|
+
break;
|
|
165
|
+
case 'API':
|
|
166
|
+
await cleanupAPI();
|
|
167
|
+
break;
|
|
168
|
+
case 'Frontend':
|
|
169
|
+
await cleanupFrontend();
|
|
170
|
+
break;
|
|
171
|
+
case 'SSH':
|
|
172
|
+
await cleanupSSH();
|
|
173
|
+
break;
|
|
174
|
+
case 'Banco':
|
|
175
|
+
await cleanupBanco();
|
|
176
|
+
break;
|
|
177
|
+
case 'Mixed':
|
|
178
|
+
await cleanupMixed();
|
|
179
|
+
break;
|
|
180
|
+
case 'Cenários':
|
|
181
|
+
await cleanupCenarios();
|
|
182
|
+
break;
|
|
183
|
+
default:
|
|
184
|
+
await cleanupGeneric();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
async function cleanupMobile() {
|
|
188
|
+
try {
|
|
189
|
+
await MobileConnection.closeSession();
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
Logger.warning(`Erro ao fechar sessão mobile: ${String(error)}`);
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
const hasActiveSession = TestContext.appiumDriver;
|
|
196
|
+
if (hasActiveSession) {
|
|
197
|
+
Logger.info('📱 Detectada sessão mobile ativa, finalizando...');
|
|
198
|
+
await Promise.race([
|
|
199
|
+
TestContext.resetAppiumDriver(),
|
|
200
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout na limpeza mobile')), 10_000)),
|
|
201
|
+
]);
|
|
202
|
+
await MobileConnection.closeSession();
|
|
203
|
+
Logger.success('Sessão mobile finalizada no teardown global');
|
|
204
|
+
}
|
|
205
|
+
Object.keys(global).forEach((key) => {
|
|
206
|
+
if (key.startsWith('mobileCleanup_') ||
|
|
207
|
+
key.startsWith('updateActivity_')) {
|
|
208
|
+
delete global[key];
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
Logger.warning(`⚠️ Erro ou timeout na limpeza mobile: ${String(error)}`);
|
|
214
|
+
// Forçar encerramento da sessão caso falhe
|
|
215
|
+
try {
|
|
216
|
+
await MobileConnection.closeSession();
|
|
217
|
+
}
|
|
218
|
+
catch (forceError) {
|
|
219
|
+
Logger.warning(`⚠️ Erro na limpeza forçada mobile: ${String(forceError)}`);
|
|
220
|
+
}
|
|
221
|
+
try {
|
|
222
|
+
TestContext.forceCleanup();
|
|
223
|
+
}
|
|
224
|
+
catch (forceError) {
|
|
225
|
+
Logger.warning(`⚠️ Erro na limpeza forçada mobile: ${String(forceError)}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
async function cleanupAPI() {
|
|
230
|
+
try {
|
|
231
|
+
const metrics = ApiActions.getMetrics();
|
|
232
|
+
const hasActivity = metrics.totalRequisicoes > 0 ||
|
|
233
|
+
Object.keys(metrics.logsPerTest || {}).length > 0;
|
|
234
|
+
if (hasActivity) {
|
|
235
|
+
Logger.info('📊 Processando relatórios de API...');
|
|
236
|
+
await Promise.race([
|
|
237
|
+
(async () => {
|
|
238
|
+
ApiActions.registrarFimExecucao();
|
|
239
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
240
|
+
})(),
|
|
241
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout nos relatórios API')), 15_000)),
|
|
242
|
+
]);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
Logger.warning(`⚠️ Erro ao processar contextos API: ${String(error)}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
async function cleanupFrontend() {
|
|
250
|
+
try {
|
|
251
|
+
await TestContext.finalizeAll();
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
Logger.warning(`⚠️ Erro na limpeza Frontend: ${String(error)}`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
async function cleanupSSH() {
|
|
258
|
+
try {
|
|
259
|
+
Logger.info('🔌 Limpeza SSH iniciada...');
|
|
260
|
+
// Desconectar via SSHActions (método principal)
|
|
261
|
+
if (SSHActions.foiUtilizado()) {
|
|
262
|
+
Logger.info('🔌 SSH foi utilizado, desconectando...');
|
|
263
|
+
await SSHActions.desconectar();
|
|
264
|
+
SSHActions.registrarFimExecucao();
|
|
265
|
+
Logger.success('SSH desconectado com sucesso');
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
Logger.info('ℹ️ SSH não foi utilizado');
|
|
269
|
+
}
|
|
270
|
+
// Garantir desconexão de qualquer SSHClient restante
|
|
271
|
+
await SSHClient.disconnectAll();
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
Logger.warning(`⚠️ Erro na limpeza SSH: ${String(error)}`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
async function cleanupBanco() {
|
|
278
|
+
try {
|
|
279
|
+
if (BancoActions.foiUtilizado()) {
|
|
280
|
+
BancoActions.registrarFimExecucao();
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
Logger.info('ℹ️ Banco não foi utilizado');
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
Logger.warning(`⚠️ Erro na limpeza Banco: ${String(error)}`);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
async function cleanupMixed() {
|
|
291
|
+
const cleanupTasks = [
|
|
292
|
+
cleanupAPI(),
|
|
293
|
+
cleanupFrontend(),
|
|
294
|
+
cleanupSSH(),
|
|
295
|
+
cleanupBanco(),
|
|
296
|
+
];
|
|
297
|
+
if (process.env.USE_MOBILE === 'true') {
|
|
298
|
+
cleanupTasks.push(cleanupMobile());
|
|
299
|
+
}
|
|
300
|
+
try {
|
|
301
|
+
await Promise.allSettled(cleanupTasks);
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
Logger.warning(`⚠️ Erro na limpeza Mixed: ${String(error)}`);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
async function cleanupCenarios() {
|
|
308
|
+
try {
|
|
309
|
+
await TestContext.finalizeAll();
|
|
310
|
+
}
|
|
311
|
+
catch (error) {
|
|
312
|
+
Logger.warning(`⚠️ Erro na limpeza Cenários: ${String(error)}`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
async function cleanupGeneric() {
|
|
316
|
+
try {
|
|
317
|
+
await TestContext.finalizeAll();
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
Logger.warning(`⚠️ Erro na limpeza genérica: ${String(error)}`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
async function globalCleanup() {
|
|
324
|
+
try {
|
|
325
|
+
await ConfigLogger.cleanup();
|
|
326
|
+
}
|
|
327
|
+
catch (error) {
|
|
328
|
+
Logger.warning(`⚠️ Erro ao limpar ConfigLogger: ${String(error)}`);
|
|
329
|
+
}
|
|
330
|
+
try {
|
|
331
|
+
cleanupEnvLock();
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
Logger.warning(`⚠️ Erro ao limpar env locks: ${String(error)}`);
|
|
335
|
+
}
|
|
336
|
+
try {
|
|
337
|
+
DataStore.cleanup();
|
|
338
|
+
}
|
|
339
|
+
catch (error) {
|
|
340
|
+
Logger.warning(`⚠️ Erro ao limpar DataStore: ${String(error)}`);
|
|
341
|
+
}
|
|
342
|
+
try {
|
|
343
|
+
const tempFiles = [
|
|
344
|
+
'.test-data-store.json',
|
|
345
|
+
'.env.lock',
|
|
346
|
+
'.configlogger.lock',
|
|
347
|
+
'.autocore/xpaths.generated.ts',
|
|
348
|
+
];
|
|
349
|
+
// ✅ ATUALIZADO: Remover .rbqa da limpeza automática
|
|
350
|
+
// Preservar para o usuário acessar execution-data.json
|
|
351
|
+
const tempDirs = [
|
|
352
|
+
// '.rbqa' // ❌ REMOVIDO: Manter dados para usuário acessar
|
|
353
|
+
];
|
|
354
|
+
let cleanedFiles = 0;
|
|
355
|
+
for (const file of tempFiles) {
|
|
356
|
+
const filePath = path.resolve(process.cwd(), file);
|
|
357
|
+
if (fs.existsSync(filePath)) {
|
|
358
|
+
try {
|
|
359
|
+
fs.unlinkSync(filePath);
|
|
360
|
+
cleanedFiles++;
|
|
361
|
+
}
|
|
362
|
+
catch {
|
|
363
|
+
// Ignorar erros de arquivos individuais
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
// ✅ NOVO: Limpeza de diretórios temporários
|
|
368
|
+
let cleanedDirs = 0;
|
|
369
|
+
for (const dir of tempDirs) {
|
|
370
|
+
const dirPath = path.resolve(process.cwd(), dir);
|
|
371
|
+
if (fs.existsSync(dirPath)) {
|
|
372
|
+
try {
|
|
373
|
+
fs.rmSync(dirPath, { recursive: true, force: true });
|
|
374
|
+
cleanedDirs++;
|
|
375
|
+
Logger.success(`Pasta ${dir} removida com sucesso (final da execução)`);
|
|
376
|
+
}
|
|
377
|
+
catch (error) {
|
|
378
|
+
Logger.warning(`⚠️ Erro ao remover pasta ${dir}: ${String(error)}`);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
if (cleanedFiles > 0 || cleanedDirs > 0) {
|
|
383
|
+
Logger.info(`🧹 Limpeza final: ${cleanedFiles} arquivo(s) e ${cleanedDirs} pasta(s) removidos`);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
catch (error) {
|
|
387
|
+
Logger.warning(`⚠️ Erro na limpeza de arquivos temporários: ${String(error)}`);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
// 🆕 Exportação padrão para uso como globalTeardown do Playwright
|
|
391
|
+
export default async function playwrightTeardown() {
|
|
392
|
+
await UnifiedTeardown.run();
|
|
393
|
+
// ✅ CRÍTICO: Garantir que o processo não termine antes do envio
|
|
394
|
+
// Isso é especialmente importante no modo UI onde o Playwright pode terminar rapidamente
|
|
395
|
+
if (!hubSendCompleted) {
|
|
396
|
+
Logger.info('⏳ Aguardando finalização de operações pendentes...');
|
|
397
|
+
await new Promise((resolve) => setTimeout(resolve, 5000));
|
|
398
|
+
}
|
|
399
|
+
Logger.info('🏁 Teardown global finalizado!');
|
|
400
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XPath Catalog (v2.7.44 - items 17, 18, 19 & 21)
|
|
3
|
+
*
|
|
4
|
+
* Mantém catálogo de XPaths por página, atualizado via `extract_page_structure`,
|
|
5
|
+
* e oferece resolução inteligente para métodos de ação (click, fill, select…).
|
|
6
|
+
*
|
|
7
|
+
* Item 17 — `extractPageStructure` como base para catálogo
|
|
8
|
+
* Item 18 — `getCurrentXPathCatalog` + resolver interno
|
|
9
|
+
* Item 19 — Geração de `.autocore/xpaths.generated.ts` para IntelliSense
|
|
10
|
+
* Item 21 — `pushToBackend` para execuções Azure sem agente de IA
|
|
11
|
+
*/
|
|
12
|
+
export interface XPathCatalogItem {
|
|
13
|
+
xpath: string;
|
|
14
|
+
tag?: string;
|
|
15
|
+
text?: string;
|
|
16
|
+
id?: string;
|
|
17
|
+
name?: string;
|
|
18
|
+
placeholder?: string;
|
|
19
|
+
ariaLabel?: string;
|
|
20
|
+
title?: string;
|
|
21
|
+
role?: string;
|
|
22
|
+
className?: string;
|
|
23
|
+
dataTestId?: string;
|
|
24
|
+
type?: string;
|
|
25
|
+
href?: string;
|
|
26
|
+
/** Score de relevância (quanto maior, melhor match) */
|
|
27
|
+
score?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface CatalogGetOptions {
|
|
30
|
+
/** URL / página alvo. Sem informar usa currentPageUrl. */
|
|
31
|
+
page?: string;
|
|
32
|
+
/** Filtro de texto livre (ex: "catalogo de ofertas"). */
|
|
33
|
+
filter?: string;
|
|
34
|
+
/** Se true, força recarregar a estrutura da página. */
|
|
35
|
+
refresh?: boolean;
|
|
36
|
+
/** default true — usar somente XPaths desta página */
|
|
37
|
+
strictPage?: boolean;
|
|
38
|
+
/** Máximo de itens retornados */
|
|
39
|
+
maxItems?: number;
|
|
40
|
+
}
|
|
41
|
+
/** Formato do retorno bruto da estrutura de página (MCP / extractBasicPageStructure) */
|
|
42
|
+
export interface RawPageStructure {
|
|
43
|
+
title?: string;
|
|
44
|
+
url?: string;
|
|
45
|
+
buttons?: XPathCatalogItem[];
|
|
46
|
+
inputs?: XPathCatalogItem[];
|
|
47
|
+
links?: XPathCatalogItem[];
|
|
48
|
+
headings?: XPathCatalogItem[];
|
|
49
|
+
elements?: XPathCatalogItem[];
|
|
50
|
+
}
|
|
51
|
+
/** Payload enviado pelo framework ao backend quando MCP não está disponível */
|
|
52
|
+
export interface CatalogExtractRequest {
|
|
53
|
+
url: string;
|
|
54
|
+
pageHtml?: string;
|
|
55
|
+
pageStructure?: RawPageStructure;
|
|
56
|
+
filter?: string;
|
|
57
|
+
strictPage?: boolean;
|
|
58
|
+
xpaths?: string[];
|
|
59
|
+
/** Nome do arquivo Page Object (item 21 v2.7.44) */
|
|
60
|
+
pageFileName?: string;
|
|
61
|
+
/** Nome legível da página (item 21 v2.7.44) */
|
|
62
|
+
pageName?: string;
|
|
63
|
+
/** Nome da classe Page Object (item 21 v2.7.44) */
|
|
64
|
+
pageObjectName?: string;
|
|
65
|
+
/** Contexto de sessão (item 21 v2.7.44) */
|
|
66
|
+
context?: {
|
|
67
|
+
currentUrl?: string;
|
|
68
|
+
sessionId?: string;
|
|
69
|
+
};
|
|
70
|
+
/** Estado de runtime capturado (item 21 v2.7.44) */
|
|
71
|
+
runtimeState?: {
|
|
72
|
+
cookies?: unknown[];
|
|
73
|
+
localStorage?: Record<string, string>;
|
|
74
|
+
sessionStorage?: Record<string, string>;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/** Resposta do backend para push de DOM */
|
|
78
|
+
export interface CatalogExtractResponse {
|
|
79
|
+
success: boolean;
|
|
80
|
+
catalog?: XPathCatalogItem[];
|
|
81
|
+
xpaths?: string[];
|
|
82
|
+
error?: string;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Função que extrai a estrutura da página atual.
|
|
86
|
+
* Deve retornar `RawPageStructure` (format idêntico ao MCP extract_page_structure).
|
|
87
|
+
*/
|
|
88
|
+
export type PageStructureExtractor = (pageUrl?: string) => Promise<RawPageStructure>;
|
|
89
|
+
export declare class XPathCatalog {
|
|
90
|
+
/** Injeta extrator de estrutura de página (obrigatório antes de usar) */
|
|
91
|
+
static setExtractor(fn: PageStructureExtractor): void;
|
|
92
|
+
/**
|
|
93
|
+
* Obtém catálogo de XPaths para a página fornecida (ou a página atual).
|
|
94
|
+
*
|
|
95
|
+
* @param currentPageUrl URL da página atual (usada quando opts.page não informado)
|
|
96
|
+
* @param opts Opções de consulta
|
|
97
|
+
*/
|
|
98
|
+
static getCatalog(currentPageUrl: string, opts?: CatalogGetOptions): Promise<XPathCatalogItem[]>;
|
|
99
|
+
/**
|
|
100
|
+
* Recarrega a estrutura da página e atualiza o cache.
|
|
101
|
+
*/
|
|
102
|
+
static refresh(pageUrl: string): Promise<XPathCatalogItem[]>;
|
|
103
|
+
/**
|
|
104
|
+
* Resolve um alvo (texto/xpath/id/name/placeholder) para o melhor XPath do catálogo.
|
|
105
|
+
* Retorna undefined se não encontrar match aceitável.
|
|
106
|
+
*/
|
|
107
|
+
static resolveFromCatalog(target: string, pageUrl: string): string | undefined;
|
|
108
|
+
/** Limpa cache de uma página específica ou todo o cache */
|
|
109
|
+
static clearCache(pageUrl?: string): void;
|
|
110
|
+
/**
|
|
111
|
+
* Envia DOM/pageStructure capturado localmente para o backend processar.
|
|
112
|
+
*
|
|
113
|
+
* Usado em execuções Azure/CI onde o backend **não** tem acesso de rede
|
|
114
|
+
* à página alvo. O framework captura `pageHtml` e/ou `pageStructure`
|
|
115
|
+
* e envia para `POST /api/xpath-catalog/extract`.
|
|
116
|
+
*
|
|
117
|
+
* O backend enriquece com hints Redis e retorna catálogo + xpaths.
|
|
118
|
+
* O resultado alimenta o cache local por página.
|
|
119
|
+
*
|
|
120
|
+
* @param request Payload com URL, pageHtml/pageStructure e filtro opcional
|
|
121
|
+
* @param authToken JWT ou chave de automação (header Authorization)
|
|
122
|
+
* @returns Resposta do backend com catálogo enriquecido
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```ts
|
|
126
|
+
* const html = await page.content()
|
|
127
|
+
* const result = await XPathCatalog.pushToBackend({
|
|
128
|
+
* url: page.url(),
|
|
129
|
+
* pageHtml: html,
|
|
130
|
+
* filter: 'cliente',
|
|
131
|
+
* })
|
|
132
|
+
* if (result?.catalog) {
|
|
133
|
+
* // catálogo já está no cache; usar via getCatalog()
|
|
134
|
+
* }
|
|
135
|
+
* ```
|
|
136
|
+
*/
|
|
137
|
+
static pushToBackend(request: CatalogExtractRequest, authToken?: string): Promise<CatalogExtractResponse | null>;
|
|
138
|
+
/**
|
|
139
|
+
* Gera arquivo `.autocore/xpaths.generated.ts` com constantes tipadas por tela.
|
|
140
|
+
*
|
|
141
|
+
* @param outputDir Diretório de saída (default: `.autocore` na raiz do projeto)
|
|
142
|
+
*/
|
|
143
|
+
static generateIntelliSenseFile(outputDir?: string): void;
|
|
144
|
+
/** Converte estrutura bruta em lista flat de XPathCatalogItem */
|
|
145
|
+
private static flatten;
|
|
146
|
+
/** Aplica filtro textual e ordena por relevância */
|
|
147
|
+
private static applyFilter;
|
|
148
|
+
/** Converte pageKey em nome de constante TypeScript */
|
|
149
|
+
private static pageKeyToConstName;
|
|
150
|
+
/** Converte item em nome de propriedade para IntelliSense */
|
|
151
|
+
private static itemToPropName;
|
|
152
|
+
}
|