feat: CCA multi-record popup — save popup as PDF and read green/red status badge
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -482,6 +482,40 @@ class AutomationCCAEligibilityCheck:
|
|||||||
print(f"[CCA step1] Exception: {e}")
|
print(f"[CCA step1] Exception: {e}")
|
||||||
return f"ERROR: step1 failed: {e}"
|
return f"ERROR: step1 failed: {e}"
|
||||||
|
|
||||||
|
def _capture_popup_pdf(self):
|
||||||
|
"""Screenshot the visible popup and wrap it in a PDF (no extra deps)."""
|
||||||
|
try:
|
||||||
|
shot = self.driver.execute_cdp_cmd("Page.captureScreenshot", {"format": "png"})
|
||||||
|
png_b64 = shot.get("data", "")
|
||||||
|
if not png_b64:
|
||||||
|
return ""
|
||||||
|
original_window = self.driver.current_window_handle
|
||||||
|
self.driver.execute_script("window.open('about:blank','_blank');")
|
||||||
|
self.driver.switch_to.window(self.driver.window_handles[-1])
|
||||||
|
html = ("<html><body style='margin:0'><img style='width:100%' "
|
||||||
|
f"src='data:image/png;base64,{png_b64}'></body></html>")
|
||||||
|
self.driver.get("data:text/html;base64," + base64.b64encode(html.encode()).decode())
|
||||||
|
time.sleep(1)
|
||||||
|
res = self.driver.execute_cdp_cmd("Page.printToPDF", {
|
||||||
|
"printBackground": True,
|
||||||
|
"paperWidth": 11,
|
||||||
|
"paperHeight": 8.5,
|
||||||
|
"marginTop": 0.2, "marginBottom": 0.2,
|
||||||
|
"marginLeft": 0.2, "marginRight": 0.2,
|
||||||
|
})
|
||||||
|
self.driver.close()
|
||||||
|
self.driver.switch_to.window(original_window)
|
||||||
|
data = res.get("data", "")
|
||||||
|
print(f"[CCA step2] Popup PDF, b64 len={len(data)}")
|
||||||
|
return data
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[CCA step2] Popup capture failed: {e}")
|
||||||
|
try:
|
||||||
|
self.driver.switch_to.window(self.driver.window_handles[0])
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
return ""
|
||||||
|
|
||||||
def step2(self):
|
def step2(self):
|
||||||
"""
|
"""
|
||||||
Extract all patient information from the result popup,
|
Extract all patient information from the result popup,
|
||||||
@@ -508,6 +542,29 @@ class AutomationCCAEligibilityCheck:
|
|||||||
eligibility = "Eligible"
|
eligibility = "Eligible"
|
||||||
elif "not eligible" in body_text.lower() or "ineligible" in body_text.lower():
|
elif "not eligible" in body_text.lower() or "ineligible" in body_text.lower():
|
||||||
eligibility = "Not Eligible"
|
eligibility = "Not Eligible"
|
||||||
|
else:
|
||||||
|
# Popup rows show a status badge: green = active, red = not active
|
||||||
|
try:
|
||||||
|
badge = self.driver.execute_script("""
|
||||||
|
const out = [];
|
||||||
|
document.querySelectorAll('span,div,label').forEach(el => {
|
||||||
|
if (el.children.length === 0 && /^\\s*(not\\s+)?(eligible|ineligible|inactive)\\s*$/i.test(el.textContent)) {
|
||||||
|
if (el.offsetParent === null) return;
|
||||||
|
const m = getComputedStyle(el).backgroundColor.match(/\\d+/g) || [];
|
||||||
|
out.push({t: el.textContent.trim(), r: +m[0], g: +m[1], b: +m[2]});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return out;
|
||||||
|
""") or []
|
||||||
|
for b in badge:
|
||||||
|
if b["g"] > b["r"] and b["g"] > b["b"]:
|
||||||
|
eligibility = "Eligible"
|
||||||
|
break
|
||||||
|
if b["r"] > b["g"] and b["r"] > b["b"]:
|
||||||
|
eligibility = "Not Eligible"
|
||||||
|
print(f"[CCA step2] Status badges: {badge} -> {eligibility}")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[CCA step2] Badge check failed: {e}")
|
||||||
|
|
||||||
# --- Patient name ---
|
# --- Patient name ---
|
||||||
for sel in [
|
for sel in [
|
||||||
@@ -643,15 +700,18 @@ class AutomationCCAEligibilityCheck:
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
if not view_report_clicked:
|
if not view_report_clicked:
|
||||||
print("[CCA step2] 'View Eligibility Report' button not found")
|
print("[CCA step2] 'View Eligibility Report' button not found; "
|
||||||
raise Exception("View Eligibility Report button not found")
|
"capturing the popup itself")
|
||||||
|
pdfBase64 = self._capture_popup_pdf()
|
||||||
|
if not pdfBase64:
|
||||||
|
raise Exception("View Eligibility Report button not found")
|
||||||
|
|
||||||
# Wait for download to start
|
# Wait for download to start
|
||||||
time.sleep(3)
|
time.sleep(3)
|
||||||
|
|
||||||
# Check for downloaded file (this site downloads rather than opens in-tab)
|
# Check for downloaded file (this site downloads rather than opens in-tab)
|
||||||
pdf_path = None
|
pdf_path = None
|
||||||
for i in range(15):
|
for i in range(0 if pdfBase64 else 15):
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
current_files = set(glob.glob(os.path.join(self.download_dir, "*")))
|
current_files = set(glob.glob(os.path.join(self.download_dir, "*")))
|
||||||
new_files = current_files - existing_files
|
new_files = current_files - existing_files
|
||||||
@@ -662,7 +722,9 @@ class AutomationCCAEligibilityCheck:
|
|||||||
print(f"[CCA step2] PDF downloaded: {pdf_path}")
|
print(f"[CCA step2] PDF downloaded: {pdf_path}")
|
||||||
break
|
break
|
||||||
|
|
||||||
if pdf_path and os.path.exists(pdf_path):
|
if pdfBase64:
|
||||||
|
pass
|
||||||
|
elif pdf_path and os.path.exists(pdf_path):
|
||||||
with open(pdf_path, "rb") as f:
|
with open(pdf_path, "rb") as f:
|
||||||
pdfBase64 = base64.b64encode(f.read()).decode()
|
pdfBase64 = base64.b64encode(f.read()).decode()
|
||||||
print(f"[CCA step2] PDF from download: {os.path.basename(pdf_path)} "
|
print(f"[CCA step2] PDF from download: {os.path.basename(pdf_path)} "
|
||||||
|
|||||||
Reference in New Issue
Block a user