96 lines
2.9 KiB
Python
96 lines
2.9 KiB
Python
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()
|