import json import time from playwright.sync_api import sync_playwright SITE = "https://10.0.5.145/connection" LOGIN = "admin" PASSWORD = "admin" js_script = """ (() => { const scrollContainer = document.querySelector('.MuiDataGrid-virtualScroller'); if (!scrollContainer) return { error: 'Не нашёл контейнер скролла таблицы' }; const getVisibleRows = () => [...document.querySelectorAll('[data-rowindex]')]; const extractRow = (rowEl, fields) => { const cells = [...rowEl.querySelectorAll('[role="gridcell"]')]; const rowObj = {}; cells.forEach((cell, i) => { const field = fields[i] || 'col_' + i; let value = cell.innerText.trim(); const checkbox = cell.querySelector('input[type="checkbox"]'); if (checkbox) { value = checkbox.value || checkbox.checked.toString(); } else if (!value) { value = cell.getAttribute('title') || (cell.querySelector('[title]')?.getAttribute('title')) || ''; } rowObj[field] = value; }); return rowObj; }; const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); const seen = new Set(); const rows = []; const maxStuck = 8; let stuckCount = 0; const fields = [...document.querySelectorAll('.MuiDataGrid-columnHeader')] .map(col => col.dataset.field); return (async () => { while (stuckCount < maxStuck) { const visible = getVisibleRows(); for (const rowEl of visible) { const idx = Number(rowEl.dataset.rowindex); if (!seen.has(idx)) { seen.add(idx); rows[idx] = extractRow(rowEl, fields); stuckCount = 0; } } const before = seen.size; scrollContainer.scrollBy(0, 500); await sleep(200); const after = seen.size; if (after === before) stuckCount++; } return rows; })(); })(); """ with sync_playwright() as p: browser = p.chromium.launch(headless=False) context = browser.new_context(ignore_https_errors=True) page = context.new_page() page.goto(SITE) page.wait_for_selector(".login-form", timeout=15000) # авторизация page.fill('input[name="Login"]', LOGIN) page.fill('input[name="Password"]', PASSWORD) page.click('.login-form button[type="submit"]') # ждём появления таблицы после авторизации page.wait_for_selector(".MuiDataGrid-virtualScroller", timeout=30000) # сбор таблицы start_time = time.time() result = page.evaluate(js_script) total_time = time.time() - start_time if "error" in result: print("Ошибка:", result["error"]) else: print(json.dumps(result, indent=2, ensure_ascii=False)) print(f"Всего строк: {len(result)}") print(f"Время выполнения: {total_time:.2f} секунд") browser.close()