Skip to content

Commit ae24937

Browse files
committed
Expand utils tree with web-platform, security, perf, AI, and governance modules
Adds 73 modules across the testing lifecycle: WebTransport / IndexedDB / File System Access / Notifications instrumentation; mixed-content / clickjacking / open-redirect / SRI / COOP-COEP audits; INP / hydration / bundle / 3p / LoAF budgets; gRPC / webhook / idempotency / pagination integration helpers; AI narrator / repro-minimizer / locator-hardener / categorizer; quarantine-age, test-debt, SLA, repro-stability, and CODEOWNERS reports. Each ships with a focused unit-test file.
1 parent fbf6e49 commit ae24937

221 files changed

Lines changed: 34727 additions & 2 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CLAUDE.md

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,80 @@ je_web_runner/
4545
├── socket_server/ # TCP socket server for remote control
4646
├── test_object/ # Test object & record classes (Value Object pattern)
4747
├── test_record/ # Action recording
48-
└── xml/ # XML utilities
48+
├── xml/ # XML utilities
49+
├── chrome_profile/ # Persistent Chrome profile + stealth + snapshot/sync-back
50+
├── failure_triage/ # AI failure root-cause analysis on failure bundles
51+
├── flake_detector/ # Time-decayed flake scoring + quarantine registry
52+
├── locator_health/ # Project-wide locator audit + upgrade suggestions
53+
├── device_cloud/ # Real-device cloud (BrowserStack/Sauce/LambdaTest) connector
54+
├── otel_bridge/ # W3C traceparent injection for distributed tracing
55+
├── mutation_testing/ # Action JSON mutation testing (kill rate / score)
56+
├── otp_interceptor/ # MailHog/Mailpit/IMAP/SMS OTP polling for 2FA flows
57+
├── download_verify/ # PDF / CSV / Excel / JSON / SHA256 download assertions
58+
├── test_auto_repair/ # LLM-driven test rewrite from failure + git diff
59+
├── edge_case_generator/ # LLM edge-case variant generator (complement to mutation_testing)
60+
├── openapi_to_e2e/ # OpenAPI/Swagger spec → WR_http_* action JSON
61+
├── cross_tab_sync/ # Multi-page BroadcastChannel / storage propagation asserts
62+
├── visual_ai/ # aHash/dHash/pHash + SSIM-proxy for canvas/chart diff
63+
├── test_scheduler/ # Value-density scheduler under time + cloud budget
64+
├── walkthrough_docs/ # AI step-by-step SOP / Confluence doc from recorded runs
65+
├── live_dashboard/ # Aggregated web UI: runs + flake + quarantine + locators
66+
├── ocr_assert/ # OCR-based text assertion for canvas / WebGL / image content
67+
├── email_render/ # Capture outbound mail (MailHog/Mailpit/EML) + multi-viewport screenshots
68+
├── backend_log_correlator/ # W3C trace_id → Loki/Elasticsearch/file log fetch into failure bundle
69+
├── websocket_assert/ # WebSocket frame recorder + count / payload / pubsub assertions
70+
├── console_error_budget/ # JS console / unhandled-rejection budget with ignore patterns
71+
├── chaos_hooks/ # Seeded chaos injection (offline / throttle / mid-flow reload)
72+
├── pr_risk_score/ # Fuse flake / impact / locator / coverage signals into 0-100 PR risk
73+
├── flag_matrix/ # Feature-flag combo matrix with constraints + minimal failing subset
74+
├── session_to_test/ # rrweb / generic session events → WR action JSON
75+
├── exploratory_ai/ # Agentic exploratory tester (observer/planner protocols + RandomPlanner)
76+
├── story_to_actions/ # LLM-driven user story / Figma frame → validated WR action JSON
77+
├── db_snapshot/ # Per-test DB savepoint/rollback with pluggable backend
78+
├── time_freezer/ # Inject Date/Date.now/performance.now patch via CDP for deterministic time tests
79+
├── persona_runner/ # Same suite × N personas (admin/free/enterprise) matrix
80+
├── token_leak_detector/ # Scan HAR / logs / responses for leaked JWTs, API keys, session tokens
81+
├── consent_audit/ # GDPR/CCPA cookie classification + pre-consent / post-reject violation detection
82+
├── pii_in_screenshot/ # OCR + PII regex (Luhn-validated card, SSN, TWID) scanner over screenshots
83+
├── pseudo_localization/ # ASCII → look-alike + expansion + brackets; detect hard-coded i18n leaks
84+
├── screen_reader_runner/ # Walk a11y tree to simulate NVDA/VoiceOver order + flag a11y violations
85+
├── forced_colors_mode/ # dark / reduced-motion / forced-colors / high-contrast matrix verification
86+
├── sse_assert/ # Server-Sent Events recorder + count/data/JSON-shape/strict-id assertions
87+
├── webrtc_assert/ # PeerConnection state / ICE / track / RTP stats assertions
88+
├── view_transitions/ # Instrumentation + duration/CLS/group assertions for View Transitions API
89+
├── test_dedup_ai/ # Structural + embedding-based semantic dedupe of action JSON files
90+
├── multimodal_qa/ # Send screenshot + question to vision LLM, parse pass/fail/notes envelope
91+
├── prompt_drift_monitor/ # Track LLM-feature output drift via embeddings + lexical anchors
92+
├── git_bisect_flake/ # Ledger-only or probe-driven bisect to find regression commit
93+
├── test_cost_estimator/ # Cloud-minute × rate-card × CO₂ estimate per suite/runner/test
94+
├── slack_digest/ # Render Slack Block-Kit / Teams card / plain-text test digest payload
95+
├── webtransport_assert/ # HTTP/3 WebTransport datagram + stream frame recorder + assertions
96+
├── indexed_db_explorer/ # IndexedDB snapshot harvest + store/key/index/record assertions
97+
├── file_system_access/ # Mock showOpenFilePicker/showSaveFilePicker + record writes
98+
├── notifications_audit/ # Notification.requestPermission timing + permission/spam policy checks
99+
├── mixed_content_audit/ # HTTP-on-HTTPS detection via HAR + console scanner
100+
├── clickjacking_audit/ # X-Frame-Options / frame-ancestors header check + iframe probe
101+
├── open_redirect_detector/ # Probe ?redirect=/?next= params with attacker-host payloads
102+
├── sri_verify/ # Subresource Integrity hash presence + correctness + crossorigin
103+
├── coop_coep_audit/ # crossOriginIsolated COOP/COEP + per-resource CORP/CORS check
104+
├── inp_tracker/ # Interaction to Next Paint instrumentation + p98 + budget
105+
├── hydration_check/ # SSR hydration mismatch detection (DOM diff + console markers)
106+
├── bundle_budget/ # Per-asset-kind byte budget from HAR + biggest-assets ranking
107+
├── third_party_budget/ # Third-party vendor classification + req/byte/blocking-ms budgets
108+
├── long_animation_frame/ # Long Animation Frame API listener + per-script attribution
109+
├── grpc_tester/ # gRPC stub call recorder + gRPC-Web framing/trailer helpers
110+
├── webhook_receiver/ # Threaded HTTP server for catching app's outbound webhooks
111+
├── idempotency_check/ # Run request twice + compare status/body/state/side-effects
112+
├── pagination_audit/ # Walk all pages, detect dups/gaps/cursor-loop/sort violations
113+
├── failure_narrator/ # LLM natural-language failure summary from failure_bundle
114+
├── repro_minimizer/ # Delta-debugging (ddmin) to shrink failing action list to minimum
115+
├── locator_hardener/ # Heuristic fragility score + LLM-suggested stable selectors
116+
├── test_categorizer/ # Auto-tag tests as smoke / regression / perf / a11y / data / api
117+
├── quarantine_age_report/ # Quarantine entries with age + fresh/lingering/stale/abandoned tiers
118+
├── test_debt_dashboard/ # Inventory of skip/xfail/TODO/_skip markers with age + CODEOWNERS
119+
├── sla_tracker/ # % suites finishing under SLA threshold, weekly/daily bucketing
120+
├── bug_repro_stability/ # Repeat probe N times, classify deterministic/flaky/non-reproducible
121+
└── test_owners_map/ # CODEOWNERS parser + override layer + unowned-test audit
49122
```
50123

51124
## Design Patterns & Architecture

je_web_runner/__init__.py

Lines changed: 290 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,205 @@
177177
from je_web_runner.utils.recorder.browser_recorder import save_recording as recorder_save_recording
178178
from je_web_runner.utils.recorder.browser_recorder import start_recording as recorder_start
179179
from je_web_runner.utils.recorder.browser_recorder import stop_recording as recorder_stop
180+
from je_web_runner.utils.chrome_profile.profile_manager import (
181+
ChromeProfileError,
182+
StealthFlags,
183+
build_chrome_options as chrome_profile_build_options,
184+
build_playwright_persistent_context,
185+
build_stealth_chrome_driver,
186+
chrome_profile_session,
187+
cleanup_chrome_locks,
188+
minimise_chrome_windows,
189+
snapshot_chrome_profile,
190+
sync_chrome_profile_back,
191+
)
192+
from je_web_runner.utils.failure_triage.triage import (
193+
FailureTriageError,
194+
TriageReport,
195+
TriageSignals,
196+
extract_signals_from_bundle,
197+
render_markdown as triage_render_markdown,
198+
save_report as triage_save_report,
199+
triage_bundle,
200+
triage_failure,
201+
)
202+
from je_web_runner.utils.flake_detector.detector import (
203+
FlakeDetectorError,
204+
FlakeScore,
205+
QuarantineEntry,
206+
QuarantineRegistry,
207+
compute_flake_scores,
208+
flaky_paths as flake_detector_flaky_paths,
209+
flaky_quarantine,
210+
quarantine_flaky,
211+
quarantine_report_markdown,
212+
release_if_stable,
213+
)
214+
from je_web_runner.utils.locator_health.health_report import (
215+
FallbackHitTracker,
216+
LocatorFinding,
217+
LocatorHealthError,
218+
LocatorHealthReport,
219+
UpgradeSuggestion as LocatorUpgradeSuggestion,
220+
apply_upgrades as locator_apply_upgrades,
221+
build_health_report as locator_build_health_report,
222+
fallback_hit_tracker,
223+
render_health_markdown as locator_render_health_markdown,
224+
save_health_report,
225+
scan_action_file as locator_scan_action_file,
226+
scan_project as locator_scan_project,
227+
suggest_upgrade as locator_suggest_upgrade,
228+
suggest_upgrades as locator_suggest_upgrades,
229+
)
230+
from je_web_runner.utils.device_cloud.real_device import (
231+
CloudCredentials,
232+
CloudSession,
233+
DeviceCloudError,
234+
RealDeviceCaps,
235+
build_capabilities as device_cloud_build_capabilities,
236+
connect_real_device,
237+
fetch_session_info,
238+
load_credentials as device_cloud_load_credentials,
239+
session_summary_markdown,
240+
update_session_status,
241+
)
242+
from je_web_runner.utils.otel_bridge.trace_bridge import (
243+
TraceBridgeError,
244+
TraceContext,
245+
bridged_span_playwright,
246+
bridged_span_selenium,
247+
clear_headers_playwright,
248+
clear_headers_selenium,
249+
current_otel_context,
250+
inject_headers_playwright,
251+
inject_headers_selenium,
252+
parse_traceparent,
253+
random_trace_context,
254+
trace_link,
255+
)
256+
from je_web_runner.utils.mutation_testing.mutator import (
257+
Mutation,
258+
MutationResult,
259+
MutationScore,
260+
MutationTestingError,
261+
MutationType,
262+
apply_mutation,
263+
assert_min_score as mutation_assert_min_score,
264+
generate_mutations,
265+
render_mutation_markdown,
266+
run_mutation_testing,
267+
run_mutation_testing_on_file,
268+
)
269+
from je_web_runner.utils.otp_interceptor.interceptor import (
270+
ImapProvider,
271+
InMemoryProvider as OtpInMemoryProvider,
272+
InterceptedMessage,
273+
MailHogProvider,
274+
MailpitProvider,
275+
OtpInterceptError,
276+
OtpProvider,
277+
WebhookSmsProvider,
278+
extract_otp_from_text,
279+
wait_for_otp,
280+
)
281+
from je_web_runner.utils.download_verify.verifier import (
282+
DownloadAssertion,
283+
DownloadVerifyError,
284+
assert_csv_columns,
285+
assert_csv_row_count,
286+
assert_download,
287+
assert_file_sha256,
288+
assert_json_matches_schema,
289+
assert_pdf_contains,
290+
assert_pdf_matches,
291+
extract_pdf_text,
292+
read_csv_rows,
293+
read_excel_rows,
294+
read_json_file,
295+
sha256_of_file,
296+
wait_for_download,
297+
)
298+
from je_web_runner.utils.test_auto_repair.repair import (
299+
RepairPlan,
300+
TestAutoRepairError,
301+
apply_repair,
302+
collect_git_diff,
303+
propose_repair,
304+
render_repair_markdown,
305+
repair_from_bundle,
306+
)
307+
from je_web_runner.utils.edge_case_generator.generator import (
308+
EdgeCase,
309+
EdgeCaseCategory,
310+
EdgeCaseGeneratorError,
311+
EdgeCaseSuite,
312+
generate_edge_cases,
313+
generate_edge_cases_from_file,
314+
render_suite_markdown as edge_case_render_markdown,
315+
write_suite_to_dir as edge_case_write_suite,
316+
)
317+
from je_web_runner.utils.openapi_to_e2e.generator import (
318+
GeneratedTest as OpenAPIGeneratedTest,
319+
GenerationResult as OpenAPIGenerationResult,
320+
OpenAPIGeneratorError,
321+
generate_tests_from_file as openapi_generate_from_file,
322+
generate_tests_from_spec as openapi_generate_from_spec,
323+
load_spec as openapi_load_spec,
324+
synthesize_example as openapi_synthesize_example,
325+
write_tests_to_dir as openapi_write_tests,
326+
)
327+
from je_web_runner.utils.cross_tab_sync.sync_assertions import (
328+
CrossTabSyncError,
329+
PropagationResult,
330+
assert_state_propagates,
331+
broadcast_message,
332+
collect_broadcast_messages,
333+
get_storage_value,
334+
install_broadcast_recorder,
335+
post_message_to_page,
336+
set_storage_value,
337+
wait_for_broadcast,
338+
wait_for_storage,
339+
)
340+
from je_web_runner.utils.visual_ai.perceptual import (
341+
HashResult as VisualHashResult,
342+
SimilarityResult as VisualSimilarityResult,
343+
VisualAIError,
344+
assert_visual_similar,
345+
average_hash as visual_average_hash,
346+
compare_images as visual_compare_images,
347+
difference_hash as visual_difference_hash,
348+
hamming_distance as visual_hamming_distance,
349+
hash_similarity as visual_hash_similarity,
350+
perceptual_hash as visual_perceptual_hash,
351+
)
352+
from je_web_runner.utils.test_scheduler.scheduler import (
353+
Schedule,
354+
TestCandidate,
355+
TestSchedulerError,
356+
build_candidates_from_ledger,
357+
render_schedule_markdown,
358+
schedule_tests,
359+
value_density as scheduler_value_density,
360+
value_of as scheduler_value_of,
361+
)
362+
from je_web_runner.utils.walkthrough_docs.generator import (
363+
Walkthrough,
364+
WalkthroughError,
365+
WalkthroughStep,
366+
build_walkthrough,
367+
collect_steps as walkthrough_collect_steps,
368+
narrate_steps as walkthrough_narrate_steps,
369+
render_confluence as walkthrough_render_confluence,
370+
render_markdown as walkthrough_render_markdown,
371+
save_walkthrough,
372+
)
373+
from je_web_runner.utils.live_dashboard.server import (
374+
DashboardConfig,
375+
DashboardServer,
376+
LiveDashboardError,
377+
build_summary as dashboard_build_summary,
378+
)
180379
__all__ = [
181380
"web_element_wrapper", "set_webdriver_options_argument",
182381
"webdriver_wrapper_instance", "get_webdriver_manager",
@@ -236,5 +435,95 @@
236435
"pw_wait_for_timeout", "pw_wait_for_url",
237436
"pw_set_viewport_size", "pw_viewport_size",
238437
"pw_mouse_click", "pw_mouse_move", "pw_mouse_down", "pw_mouse_up",
239-
"pw_keyboard_press", "pw_keyboard_type", "pw_keyboard_down", "pw_keyboard_up"
438+
"pw_keyboard_press", "pw_keyboard_type", "pw_keyboard_down", "pw_keyboard_up",
439+
# Phase 1: chrome_profile
440+
"ChromeProfileError", "StealthFlags",
441+
"chrome_profile_build_options", "build_playwright_persistent_context",
442+
"build_stealth_chrome_driver", "chrome_profile_session",
443+
"cleanup_chrome_locks", "minimise_chrome_windows",
444+
"snapshot_chrome_profile", "sync_chrome_profile_back",
445+
# Phase 2: failure_triage
446+
"FailureTriageError", "TriageReport", "TriageSignals",
447+
"extract_signals_from_bundle", "triage_render_markdown",
448+
"triage_save_report", "triage_bundle", "triage_failure",
449+
# Phase 3: flake_detector
450+
"FlakeDetectorError", "FlakeScore", "QuarantineEntry", "QuarantineRegistry",
451+
"compute_flake_scores", "flake_detector_flaky_paths", "flaky_quarantine",
452+
"quarantine_flaky", "quarantine_report_markdown", "release_if_stable",
453+
# Phase 4: locator_health
454+
"FallbackHitTracker", "LocatorFinding", "LocatorHealthError",
455+
"LocatorHealthReport", "LocatorUpgradeSuggestion",
456+
"locator_apply_upgrades", "locator_build_health_report",
457+
"fallback_hit_tracker", "locator_render_health_markdown",
458+
"save_health_report", "locator_scan_action_file", "locator_scan_project",
459+
"locator_suggest_upgrade", "locator_suggest_upgrades",
460+
# Phase 5: device_cloud
461+
"CloudCredentials", "CloudSession", "DeviceCloudError", "RealDeviceCaps",
462+
"device_cloud_build_capabilities", "connect_real_device",
463+
"fetch_session_info", "device_cloud_load_credentials",
464+
"session_summary_markdown", "update_session_status",
465+
# Phase 6: otel_bridge
466+
"TraceBridgeError", "TraceContext",
467+
"bridged_span_playwright", "bridged_span_selenium",
468+
"clear_headers_playwright", "clear_headers_selenium",
469+
"current_otel_context", "inject_headers_playwright",
470+
"inject_headers_selenium", "parse_traceparent",
471+
"random_trace_context", "trace_link",
472+
# Phase 7: mutation_testing
473+
"Mutation", "MutationResult", "MutationScore", "MutationTestingError",
474+
"MutationType", "apply_mutation", "mutation_assert_min_score",
475+
"generate_mutations", "render_mutation_markdown",
476+
"run_mutation_testing", "run_mutation_testing_on_file",
477+
# Phase 8: otp_interceptor
478+
"ImapProvider", "OtpInMemoryProvider", "InterceptedMessage",
479+
"MailHogProvider", "MailpitProvider", "OtpInterceptError",
480+
"OtpProvider", "WebhookSmsProvider",
481+
"extract_otp_from_text", "wait_for_otp",
482+
# Phase 9: download_verify
483+
"DownloadAssertion", "DownloadVerifyError",
484+
"assert_csv_columns", "assert_csv_row_count", "assert_download",
485+
"assert_file_sha256", "assert_json_matches_schema",
486+
"assert_pdf_contains", "assert_pdf_matches",
487+
"extract_pdf_text", "read_csv_rows", "read_excel_rows",
488+
"read_json_file", "sha256_of_file", "wait_for_download",
489+
# Phase 11: test_auto_repair
490+
"RepairPlan", "TestAutoRepairError",
491+
"apply_repair", "collect_git_diff", "propose_repair",
492+
"render_repair_markdown", "repair_from_bundle",
493+
# Phase 12: edge_case_generator
494+
"EdgeCase", "EdgeCaseCategory", "EdgeCaseGeneratorError",
495+
"EdgeCaseSuite",
496+
"generate_edge_cases", "generate_edge_cases_from_file",
497+
"edge_case_render_markdown", "edge_case_write_suite",
498+
# Phase 13: openapi_to_e2e
499+
"OpenAPIGeneratedTest", "OpenAPIGenerationResult",
500+
"OpenAPIGeneratorError",
501+
"openapi_generate_from_file", "openapi_generate_from_spec",
502+
"openapi_load_spec", "openapi_synthesize_example", "openapi_write_tests",
503+
# Phase 14: cross_tab_sync
504+
"CrossTabSyncError", "PropagationResult",
505+
"assert_state_propagates", "broadcast_message",
506+
"collect_broadcast_messages", "get_storage_value",
507+
"install_broadcast_recorder", "post_message_to_page",
508+
"set_storage_value", "wait_for_broadcast", "wait_for_storage",
509+
# Phase 15: visual_ai
510+
"VisualHashResult", "VisualSimilarityResult", "VisualAIError",
511+
"assert_visual_similar",
512+
"visual_average_hash", "visual_compare_images",
513+
"visual_difference_hash", "visual_hamming_distance",
514+
"visual_hash_similarity", "visual_perceptual_hash",
515+
# Phase 16: test_scheduler
516+
"Schedule", "TestCandidate", "TestSchedulerError",
517+
"build_candidates_from_ledger", "render_schedule_markdown",
518+
"schedule_tests",
519+
"scheduler_value_density", "scheduler_value_of",
520+
# Phase 17: walkthrough_docs
521+
"Walkthrough", "WalkthroughError", "WalkthroughStep",
522+
"build_walkthrough",
523+
"walkthrough_collect_steps", "walkthrough_narrate_steps",
524+
"walkthrough_render_confluence", "walkthrough_render_markdown",
525+
"save_walkthrough",
526+
# Phase 19: live_dashboard
527+
"DashboardConfig", "DashboardServer", "LiveDashboardError",
528+
"dashboard_build_summary",
240529
]

je_web_runner/utils/backend_log_correlator/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)