Files
medevio/Medevio3CapturePatients01.py
2025-09-22 13:42:03 +02:00

102 lines
3.5 KiB
Python
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import time
from playwright.sync_api import sync_playwright
import mysql.connector
MYSQL_CFG = dict(
host="192.168.1.76",
port=3307,
user="root",
password="Vlado9674+",
database="medevio",
)
# --- load 3 patients from DB ---
conn = mysql.connector.connect(**MYSQL_CFG)
with conn.cursor() as cur:
cur.execute("""
SELECT rid, prijmeni, jmeno, rc
FROM patients_extracted
WHERE prijmeni IS NOT NULL and mamedevioucet is null
ORDER BY prijmeni ASC
LIMIT 300
""")
rows = cur.fetchall()
if not rows:
raise RuntimeError("No entries found in patients_extracted")
STATE_FILE = r"medevio_storage.json"
BASE_URL = "https://my.medevio.cz/mudr-buzalkova/klinika/pacienti"
NOT_FOUND_SEL = "div[role='alert']:has-text('Pacient nebyl nalezen'), div:has-text('Pacient nebyl nalezen')"
DIALOG_SEL = "[role='dialog'], div.MuiDrawer-paper, div[aria-modal='true']"
def close_dialog_if_open(page):
dlg = page.locator(DIALOG_SEL)
try:
if dlg.count():
# Try a close button; if not, press Escape
try:
dlg.locator("button:has-text('Zavřít'), [aria-label='Zavřít'], [aria-label='Close'], [data-testid='CloseIcon']").first.click(timeout=1000)
except:
page.keyboard.press("Escape")
page.wait_for_selector(DIALOG_SEL, state="detached", timeout=1500)
except:
pass # best-effort close
def main():
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
context = browser.new_context(storage_state=STATE_FILE)
page = context.new_page()
for rid, surname, name, rc in rows:
print(f"\nProcessing {surname} {name} {rc}")
# 1⃣ Navigation time
t0 = time.perf_counter()
page.goto(f"{BASE_URL}?pacient={rid}", wait_until="domcontentloaded")
# page.wait_for_load_state("networkidle")
t_nav = time.perf_counter() - t0
print(f" ⏱️ page.goto + networkidle: {t_nav:.2f}s")
# 2⃣ Toast / dialog detection
t1 = time.perf_counter()
not_found = False
try:
page.wait_for_selector(NOT_FOUND_SEL, timeout=2500)
not_found = True
except:
pass
if not_found:
print(f" ⚠️ not-found toast detected after {time.perf_counter() - t1:.2f}s")
continue
try:
page.wait_for_selector(DIALOG_SEL, timeout=8000)
except:
print(f" ⚠️ dialog not found (waited {time.perf_counter() - t1:.2f}s)")
continue
t_dialog = time.perf_counter() - t1
print(f" ⏱️ toast/dialog detection: {t_dialog:.2f}s")
# 3⃣ Account check + DB update
t2 = time.perf_counter()
text = page.locator(DIALOG_SEL).first.inner_text()
has_account = 0 if "zatím nemá Medevio účet" in text else 1
with conn.cursor() as c:
c.execute("UPDATE patients_extracted SET mamedevioucet=%s WHERE rid=%s",
(has_account, rid))
conn.commit()
t_db = time.perf_counter() - t2
print(f" ⏱️ DB update & text parse: {t_db:.2f}s")
# 4⃣ Optional pacing
t3 = time.perf_counter()
# time.sleep(0.5)
print(f" ⏱️ explicit sleep: {time.perf_counter() - t3:.2f}s")
browser.close()
if __name__ == "__main__":
main()