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 {