Добавить get_mui_table_playwright.py

This commit is contained in:
2025-11-07 13:44:59 +00:00
parent e7f5727875
commit 347350f43a

View File

@@ -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()