diff --git a/get_mui_table_playwright.py b/get_mui_table_playwright.py new file mode 100644 index 0000000..85f4961 --- /dev/null +++ b/get_mui_table_playwright.py @@ -0,0 +1,95 @@ +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()