From 4e5ba53811c0e3f91c306a2396b8e34fff3386e4 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Thu, 29 Oct 2026 00:32:09 +0400 Subject: [PATCH] =?UTF-8?q?perf:=20svod2-memory=20=E2=80=94=20final=20?= =?UTF-8?q?=D0=B1=D0=B5=D0=B7=20=D0=BF=D0=BE=D0=B2=D1=82=D0=BE=D1=80=D0=BD?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=D0=B0=20?= =?UTF-8?q?=C2=AB=D0=92=D1=81=D0=B5=20=D0=A1=D0=A1=D0=9F/=D0=A0=D0=A4?= =?UTF-8?q?=C2=BB,=20=D0=BE=D0=B6=D0=B8=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D0=B1=D0=B8=D0=BB=D0=B8=D0=B7=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D1=81=D1=82=D1=80=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- perf/e2e/scenarios/svod2-memory.spec.ts | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/perf/e2e/scenarios/svod2-memory.spec.ts b/perf/e2e/scenarios/svod2-memory.spec.ts index f6476f0..d556f6a 100644 --- a/perf/e2e/scenarios/svod2-memory.spec.ts +++ b/perf/e2e/scenarios/svod2-memory.spec.ts @@ -12,7 +12,7 @@ import { loginAs, WEB } from '../lib/auth'; import { throttle, heapUsed, domCounters } from '../lib/cdp'; import { append } from '../lib/results'; import { scrollThrough } from '../lib/scroll'; -import { SVOD2_DATA_ROW_SELECTOR, memoryPoints } from '../lib/svod2'; +import { SVOD2_DATA_ROW_SELECTOR, SVOD2_PLACEHOLDER_SELECTOR, memoryPoints } from '../lib/svod2'; const CONTAINER = '.MuiTableContainer-root'; const MIN_ROWS = 20; @@ -30,6 +30,24 @@ async function waitRows(page: Page, what: string): Promise { } } +/** Ждём окончания загрузки: число строк и число заглушек не меняются 3 опроса подряд (интервал 300 мс). */ +async function settle(page: Page): Promise { + let prev = ''; + let same = 0; + const t0 = Date.now(); + for (;;) { + const cur = await page.evaluate( + ([sel, rs, ph]) => `${document.querySelectorAll(`${sel} ${rs}`).length}/${document.querySelectorAll(`${sel} ${ph}`).length}`, + [CONTAINER, SVOD2_DATA_ROW_SELECTOR, SVOD2_PLACEHOLDER_SELECTOR], + ); + same = cur === prev ? same + 1 : 0; + prev = cur; + if (same >= 3) return Number(cur.split('/')[0]); + if (Date.now() - t0 > LOAD_TIMEOUT) throw new Error(`settle: строки не стабилизировались за ${LOAD_TIMEOUT} мс (${cur})`); + await page.waitForTimeout(300); + } +} + /** «Все ССП/РФ» + «Загрузить» (Svod2Page.jsx), как в scroll.spec.ts. */ async function loadAll(page: Page): Promise { await page.getByLabel('ССП/РФ').click(); @@ -78,11 +96,11 @@ for (let repeat = 0; repeat < REPEATS; repeat++) { if (!r.complete) throw new Error(`rf_scrolled: скролл не дошёл до конца (${r.reason ?? 'incomplete'})`); rows = await waitRows(page, point); } else { + // выбор и данные хранятся по вкладкам (SvodContext, useSvod2Pages): повторный loadAll снял бы «Все ССП/РФ» await page.getByRole('tab').nth(0).click(); - await loadAll(page); rows = await waitRows(page, point); } - await page.waitForTimeout(500); + rows = await settle(page); await sample(point, rows); } } finally {