const { chromium } = require('playwright'); const session = { subjectId: 'user-author', tenant: 'tenant-default', scopes: ['ui.read', 'policy:read', 'policy:author', 'policy:simulate', 'advisory:search', 'advisory:read', 'search:read', 'findings:read', 'vex:read', 'admin'], }; (async () => { const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] }); const context = await browser.newContext({ ignoreHTTPSErrors: true }); const page = await context.newPage(); page.on('requestfailed', (request) => { const url = request.url(); if (url.includes('/search')) { console.log('[requestfailed]', request.method(), url, request.failure()?.errorText); } }); page.on('response', (response) => { const url = response.url(); if ( url.includes('/api/v1/search/query') || url.includes('/api/v1/advisory-ai/search') || url.includes('/api/v1/advisory-ai/search/analytics') ) { const req = response.request(); console.log('[response]', req.method(), response.status(), url); } }); await page.addInitScript((stubSession) => { window.__stellaopsTestSession = stubSession; }, session); const url = process.argv[2] || 'https://stella-ops.local/'; console.log('[goto]', url); await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 60000 }); await page.waitForTimeout(2000); const count = await page.evaluate(() => document.querySelectorAll('app-global-search input[type="text"]').length); console.log('[search-input-count]', count); if (count === 0) { console.log('[page-url]', page.url()); console.log('[title]', await page.title()); await page.screenshot({ path: 'output/playwright/header-search-repro-no-input.png', fullPage: true }); await browser.close(); process.exit(1); } await page.click('app-global-search input[type="text"]', { timeout: 15000 }); await page.fill('app-global-search input[type="text"]', 'critical findings', { timeout: 15000 }); await page.waitForTimeout(3000); const results = await page.evaluate(() => document.querySelectorAll('app-entity-card').length); const emptyText = await page.locator('.search__empty').allTextContents(); const degradedVisible = await page.locator('.search__degraded-banner').isVisible().catch(() => false); console.log('[entity-cards]', results); console.log('[empty-text]', emptyText.join(' | ')); console.log('[degraded-banner]', degradedVisible); await page.screenshot({ path: 'output/playwright/header-search-repro-live.png', fullPage: true }); await browser.close(); })();