68 lines
2.6 KiB
Python
68 lines
2.6 KiB
Python
"""Probe full Hillsborough PA flow — landing → search → detail."""
|
|
from pathlib import Path
|
|
import time
|
|
|
|
|
|
def probe():
|
|
from playwright.sync_api import sync_playwright
|
|
|
|
out_dir = Path(__file__).parent.parent / "_probe_out" / "hcpa"
|
|
out_dir.mkdir(parents=True, exist_ok=True)
|
|
parcel = "1932071V5000000002960U"
|
|
|
|
with sync_playwright() as p:
|
|
browser = p.chromium.launch(headless=True)
|
|
page = browser.new_context(user_agent="Mozilla/5.0 Chrome/131").new_page()
|
|
|
|
# Capture all GET XHR calls to find the property data API
|
|
captured = []
|
|
page.on("request", lambda req: captured.append({"m": req.method, "url": req.url})
|
|
if req.method in ("GET", "POST") else None)
|
|
|
|
# Land on the GIS PropertySearch SPA
|
|
page.goto("https://gis.hcpafl.org/propertysearch/", wait_until="domcontentloaded")
|
|
time.sleep(7)
|
|
print(f"Landing URL: {page.url}")
|
|
print(f"Title: {page.title()}")
|
|
|
|
# Look for inputs visible
|
|
inputs = page.locator("input:visible").all()
|
|
print(f"\nVisible inputs ({len(inputs)}):")
|
|
for inp in inputs[:10]:
|
|
try:
|
|
id_ = inp.get_attribute("id") or ""
|
|
name = inp.get_attribute("name") or ""
|
|
ph = inp.get_attribute("placeholder") or ""
|
|
aria = inp.get_attribute("aria-label") or ""
|
|
print(f" id={id_!r} name={name!r} placeholder={ph!r} aria={aria!r}")
|
|
except Exception:
|
|
pass
|
|
|
|
# Try to fill the folio input — find any input that mentions 'folio'
|
|
folio_input = page.locator(
|
|
"input[placeholder*='folio' i], input[aria-label*='folio' i], "
|
|
"input[placeholder*='parcel' i], input[name*='folio' i]"
|
|
).first
|
|
if folio_input.count() > 0:
|
|
print("\nFilling folio input...")
|
|
folio_input.fill(parcel)
|
|
time.sleep(1)
|
|
# Press Enter or click Search
|
|
page.keyboard.press("Enter")
|
|
time.sleep(8)
|
|
print(f"After search URL: {page.url}")
|
|
body = page.inner_text("body")[:1000]
|
|
print(f"Body: {body.encode('ascii','replace').decode('ascii')[:800]}")
|
|
|
|
# Filter captured to property-data calls
|
|
print(f"\nRelevant network calls ({len(captured)} total):")
|
|
for c in captured[-20:]:
|
|
if any(kw in c["url"] for kw in ("Property", "Folio", "Parcel", "GetProp", "json")):
|
|
print(f" {c['m']} {c['url'][:150]}")
|
|
|
|
browser.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
probe()
|