更新: 219 个文件 - 2026-03-16 23:45:01
这个提交包含在:
@@ -27,15 +27,20 @@ def capture(url: str, run_dir: Path, prefix: str = "baseline") -> Dict[str, Any]
|
||||
network_path = run_dir / "logs" / f"{prefix}-network.json"
|
||||
console_messages: List[Dict[str, Any]] = []
|
||||
requests_seen: List[Dict[str, Any]] = []
|
||||
with sync_playwright() as p:
|
||||
browser = p.chromium.launch(headless=True)
|
||||
page = browser.new_page()
|
||||
page.on("console", lambda msg: console_messages.append({"type": msg.type, "text": msg.text}))
|
||||
page.on("request", lambda req: requests_seen.append({"method": req.method, "url": req.url}))
|
||||
page.goto(url, wait_until="networkidle", timeout=20000)
|
||||
page.screenshot(path=str(screenshot_path), full_page=True)
|
||||
dom_path.write_text(page.content(), encoding="utf-8")
|
||||
browser.close()
|
||||
try:
|
||||
with sync_playwright() as p:
|
||||
browser = p.chromium.launch(headless=True)
|
||||
page = browser.new_page()
|
||||
page.on("console", lambda msg: console_messages.append({"type": msg.type, "text": msg.text}))
|
||||
page.on("request", lambda req: requests_seen.append({"method": req.method, "url": req.url}))
|
||||
page.goto(url, wait_until="networkidle", timeout=20000)
|
||||
page.screenshot(path=str(screenshot_path), full_page=True)
|
||||
dom_path.write_text(page.content(), encoding="utf-8")
|
||||
browser.close()
|
||||
except Exception as exc:
|
||||
payload["reason"] = str(exc)
|
||||
write_json(run_dir / "logs" / f"{prefix}-browser.json", payload)
|
||||
return payload
|
||||
write_json(console_path, console_messages)
|
||||
write_json(network_path, requests_seen)
|
||||
payload = {
|
||||
|
||||
@@ -164,18 +164,23 @@ def cmd_run_case(args) -> int:
|
||||
run_dir = _run_dir(run_id)
|
||||
|
||||
provision_result = provision.prepare(profile, run_dir, dry_run=args.dry_run)
|
||||
baseline_payload = baseline.collect(profile, run_dir) if profile.get("baseline_urls") else {"observations": []}
|
||||
attack_payload = attack.run_attack(profile, advisory, run_dir, dry_run=args.dry_run)
|
||||
allow_runtime_steps = provision_result.get("status") not in {"blocked-artifact"}
|
||||
baseline_payload = (
|
||||
baseline.collect(profile, run_dir) if profile.get("baseline_urls") and allow_runtime_steps else {"observations": []}
|
||||
)
|
||||
attack_payload = (
|
||||
attack.run_attack(profile, advisory, run_dir, dry_run=args.dry_run) if allow_runtime_steps else {"steps": []}
|
||||
)
|
||||
|
||||
browser_payload = {"required": bool(profile.get("browser_assertions", {}).get("required")), "present": False, "refs": []}
|
||||
blocked_reason = provision_result.get("blocked_reason")
|
||||
if browser_payload["required"] and not args.dry_run and profile.get("baseline_urls"):
|
||||
if browser_payload["required"] and not args.dry_run and profile.get("baseline_urls") and allow_runtime_steps:
|
||||
browser_payload = browser.capture(profile["baseline_urls"][0], run_dir, prefix="proof")
|
||||
if not browser_payload.get("present"):
|
||||
blocked_reason = blocked_reason or browser_payload.get("reason")
|
||||
|
||||
compose_path = Path(provision_result["compose_path"])
|
||||
container_logs = evidence.collect_container_logs(run_dir, compose_path) if compose_path.exists() else []
|
||||
container_logs = evidence.collect_container_logs(run_dir, compose_path) if compose_path.exists() and allow_runtime_steps else []
|
||||
|
||||
verification_status = "triage-manual"
|
||||
verification_mode = profile.get("verification_mode", "synthetic")
|
||||
|
||||
在新工单中引用
屏蔽一个用户