93 lines
3.8 KiB
Python
93 lines
3.8 KiB
Python
"""Probe Civitek Case Search tab structure."""
|
|
from pathlib import Path
|
|
|
|
|
|
def probe():
|
|
from playwright.sync_api import sync_playwright
|
|
|
|
out_dir = Path(__file__).parent.parent / "_probe_out" / "civitek"
|
|
|
|
with sync_playwright() as p:
|
|
browser = p.chromium.launch(headless=True)
|
|
page = browser.new_context().new_page()
|
|
|
|
# Walk to search
|
|
page.goto("https://www.civitekflorida.com/ocrs/county/27/")
|
|
page.wait_for_timeout(1500)
|
|
page.locator("button:has-text('Public')").first.click()
|
|
page.wait_for_timeout(2500)
|
|
page.locator("button:has-text('I Agree')").first.click()
|
|
page.wait_for_timeout(2500)
|
|
|
|
# Click "Case Search" tab (data-index=1)
|
|
print("[1] Clicking 'Case Search' tab...")
|
|
case_tab = page.locator("li[role='tab']:has-text('Case Search')").first
|
|
case_tab.click()
|
|
page.wait_for_timeout(2500)
|
|
(out_dir / "05_case_search_tab.html").write_text(page.content(), encoding="utf-8")
|
|
|
|
# Find new fields exposed under Case Search tab
|
|
print("\n[2] Inputs visible after switching tab:")
|
|
for inp in page.locator("input:visible, select:visible").all()[:30]:
|
|
try:
|
|
tag = inp.evaluate("el => el.tagName.toLowerCase()")
|
|
id_ = inp.get_attribute("id") or ""
|
|
name = inp.get_attribute("name") or ""
|
|
type_ = inp.get_attribute("type") or ""
|
|
placeholder = inp.get_attribute("placeholder") or ""
|
|
if type_ == "hidden":
|
|
continue
|
|
# Get label
|
|
label_for = ""
|
|
if id_:
|
|
lbl = page.locator(f"label[for='{id_}']").first
|
|
if lbl.count() > 0:
|
|
label_for = lbl.inner_text()[:50]
|
|
print(f" <{tag}> id={id_!r} type={type_!r} label={label_for!r}")
|
|
except Exception:
|
|
pass
|
|
|
|
# Test: search for a known case_number from our realauction inventory
|
|
# Most realauction cases are like "2024-CA-001234" or "23-2024-CA-001234"
|
|
# Try a generic test case number first to see the UI behavior
|
|
print("\n[3] Looking for case_number input field name...")
|
|
case_inputs = page.locator("input[id*='case' i], input[id*='Case'], input[name*='case' i]").all()
|
|
for inp in case_inputs[:5]:
|
|
try:
|
|
id_ = inp.get_attribute("id") or ""
|
|
name = inp.get_attribute("name") or ""
|
|
print(f" case-like input: id={id_!r} name={name!r}")
|
|
except Exception:
|
|
pass
|
|
|
|
# Submit empty to see validation errors
|
|
print("\n[4] Submitting empty Case Search to see required fields...")
|
|
search_btn = page.locator("button:has(.ui-button-text:text-is('Search'))").first
|
|
if search_btn.count() == 0:
|
|
search_btn = page.locator("button:has-text('Search')").first
|
|
try:
|
|
search_btn.click()
|
|
page.wait_for_timeout(2500)
|
|
except Exception as e:
|
|
print(f" click error: {e}")
|
|
|
|
# Capture error messages
|
|
print("\n[5] Validation messages after empty submit:")
|
|
for sel in [".ui-messages-error", ".ui-message-error", ".ui-message"]:
|
|
for m in page.locator(sel).all()[:5]:
|
|
try:
|
|
t = (m.inner_text() or "").strip()[:200]
|
|
if t:
|
|
print(f" [{sel}] {t}")
|
|
except Exception:
|
|
pass
|
|
|
|
(out_dir / "06_case_search_empty_submit.html").write_text(page.content(), encoding="utf-8")
|
|
page.screenshot(path=str(out_dir / "06_case_search.png"), full_page=True)
|
|
print(f"\n[OK] saved to {out_dir}/")
|
|
browser.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
probe()
|