diff --git a/scripts/src/hwlab-node-web-observe-runner-source.ts b/scripts/src/hwlab-node-web-observe-runner-source.ts index a7e0428c..5f6c97b5 100644 --- a/scripts/src/hwlab-node-web-observe-runner-source.ts +++ b/scripts/src/hwlab-node-web-observe-runner-source.ts @@ -1717,7 +1717,7 @@ async function sampleOnePage(targetPage, { reason, groupSeq, pageRole, targetPag } return null; }; - const summarize = (selector, limit) => Array.from(document.querySelectorAll(selector)).filter(visible).slice(-limit).map((element, index) => { + const summarizeElements = (elements, limit) => elements.filter(visible).slice(-limit).map((element, index) => { const rect = element.getBoundingClientRect(); const owner = element.closest('article.message-card, .message-card[data-message-id], article[data-message-id], [data-trace-id]'); const timeElement = element.matches("time,[datetime]") ? element : element.querySelector("time,[datetime]"); @@ -1741,6 +1741,7 @@ async function sampleOnePage(targetPage, { reason, groupSeq, pageRole, targetPag rect: { x: Math.round(rect.x), y: Math.round(rect.y), width: Math.round(rect.width), height: Math.round(rect.height) }, }; }); + const summarize = (selector, limit) => summarizeElements(Array.from(document.querySelectorAll(selector)), limit); const summarizeMessages = (selector, limit) => Array.from(document.querySelectorAll(selector)).filter(visible).slice(-limit).map((element, index) => { const rect = element.getBoundingClientRect(); return { @@ -1793,10 +1794,13 @@ async function sampleOnePage(targetPage, { reason, groupSeq, pageRole, targetPag const activeSession = document.querySelector('[data-active="true"][data-session-id], [aria-selected="true"][data-session-id], .active[data-session-id]'); const activeSessionId = activeSession ? activeSession.getAttribute("data-session-id") : null; const messageSelector = 'article.message-card, .message-card[data-message-id], article[data-message-id]'; - const traceSelector = '[data-testid*="trace" i], [class*="trace" i], [data-trace-id], [data-testid*="event" i]'; + const stableTraceSelector = 'li.trace-render-row[data-row-id], li.trace-render-row[data-testid="trace-render-row"], [data-testid="trace-render-row"][data-row-id]'; + const fallbackTraceSelector = '[data-testid*="trace" i], [class*="trace" i], [data-trace-id], [data-testid*="event" i]'; const diagnosticSelector = '.api-error-diagnostic, [class*="api-error-diagnostic" i], [class*="message-diagnostic" i], [class*="projection-diagnostic" i], [data-testid="api-error-diagnostic" i], [data-testid="error-diagnostic" i], [data-testid*="diagnostic" i], [role="alert"], [aria-live="assertive"]'; const messages = summarizeMessages(messageSelector, 80); - const traceRows = summarize(traceSelector, 30); + const stableTraceElements = Array.from(document.querySelectorAll(stableTraceSelector)); + const fallbackTraceElements = Array.from(document.querySelectorAll(fallbackTraceSelector)).filter((element) => element.matches('li,[role="listitem"],[data-testid*="trace-row" i],[data-testid*="event-row" i]')); + const traceRows = summarizeElements(stableTraceElements.length > 0 ? stableTraceElements : fallbackTraceElements, 30); const loadings = collectLoadingNodes(); const sessionRail = collectSessionRailTitles(); const diagnostics = Array.from(document.querySelectorAll(diagnosticSelector)).filter(visible).slice(-40).map((element, index) => {