Files
get-mui-table/get_mui_table_playwright.py

96 lines
2.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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