scitex_browser.debugging

async scitex_browser.debugging.show_grid_async(page, func_name='show_grid_async')[source]
async scitex_browser.debugging.highlight_element_async(element, duration_ms=1000, func_name='highlight_element_async')[source]

Highlight element with red overlay rectangle.

Parameters:
  • element (Locator) – Locator to highlight

  • duration_ms (int) – Duration to display highlight in milliseconds

  • func_name (str) – Name of calling function for logging context

scitex_browser.debugging.inject_visual_effects(page)[source]

Inject CSS and elements for visual effects (sync version).

Return type:

None

async scitex_browser.debugging.inject_visual_effects_async(page)[source]

Inject CSS and elements for visual effects (async version).

Return type:

None

scitex_browser.debugging.show_cursor_at(page, x, y, state='normal')[source]

Move visual cursor to position (sync version).

Parameters:
  • page (Union[Page, Page]) – Playwright page object

  • x (float) – X coordinate

  • y (float) – Y coordinate

  • state (str) – Cursor state - “normal”, “clicking”, or “dragging”

Return type:

None

async scitex_browser.debugging.show_cursor_at_async(page, x, y, state='normal')[source]

Move visual cursor to position (async version).

Return type:

None

scitex_browser.debugging.show_click_effect(page, x, y)[source]

Show click ripple effect at position (sync version).

Return type:

None

async scitex_browser.debugging.show_click_effect_async(page, x, y)[source]

Show click ripple effect at position (async version).

Return type:

None

scitex_browser.debugging.show_step(page, step, total, message, level='info')[source]

Show numbered step message in browser (sync version).

Parameters:
  • page (Union[Page, Page]) – Playwright page object

  • step (int) – Current step number

  • total (int) – Total number of steps

  • message (str) – Message to display

  • level (str) – Message level - “info”, “success”, “warning”, or “error”

Return type:

None

async scitex_browser.debugging.show_step_async(page, step, total, message, level='info')[source]

Show numbered step message in browser (async version).

Return type:

None

scitex_browser.debugging.show_test_result(page, success, message='', delay_ms=3000)[source]

Show test result banner (PASS/FAIL) and wait (sync version).

Parameters:
  • page (Union[Page, Page]) – Playwright page object

  • success (bool) – True for PASS, False for FAIL

  • message (str) – Optional message to display

  • delay_ms (int) – How long to display before continuing

Return type:

None

async scitex_browser.debugging.show_test_result_async(page, success, message='', delay_ms=3000)[source]

Show test result banner (PASS/FAIL) and wait (async version).

Return type:

None

scitex_browser.debugging.setup_console_interceptor(page)[source]

Set up console log interceptor with source tracking and error capture.

Features (mirroring console-interceptor.ts): - Intercepts console.log, info, warn, error, debug - Captures source file and line number - Captures unhandled JS errors - Captures unhandled promise rejections - Captures resource loading failures

Call this at the start of each test to begin capturing logs.

Return type:

None

scitex_browser.debugging.collect_console_logs(page)[source]

Collect all captured console logs from the browser.

Return type:

list

Returns:

List of log strings in format “[LEVEL] source message”

scitex_browser.debugging.collect_console_logs_detailed(page)[source]

Collect all captured console logs with full details.

Returns:

level, message, source, timestamp, url

Return type:

List of dicts with keys

scitex_browser.debugging.format_logs_devtools_style(logs)[source]

Format logs in DevTools-like style.

Parameters:

logs (list) – List of detailed log entries from collect_console_logs_detailed()

Return type:

str

Returns:

Formatted string like browser DevTools output

scitex_browser.debugging.save_failure_artifacts(page, test_name, artifacts_dir, console_logs=None)[source]

Save screenshot, console logs, and page HTML on test failure.

Parameters:
  • page (Page) – Playwright page object

  • test_name (str) – Name of the failed test (e.g., request.node.nodeid)

  • artifacts_dir (Path | str) – Directory to save artifacts

  • console_logs (list | None) – Pre-collected console logs (optional, will collect if None)

Return type:

dict

Returns:

Dict with paths to saved artifacts

scitex_browser.debugging.create_failure_capture_fixture(artifacts_dir)[source]

Create a pytest fixture for automatic failure capture.

Usage in conftest.py:

from scitex_browser.debugging import create_failure_capture_fixture

capture_on_failure = create_failure_capture_fixture(

Path(__file__).parent / “artifacts”

)

Parameters:

artifacts_dir (Path | str) – Directory to save failure artifacts

Returns:

A pytest fixture function

async scitex_browser.debugging.capture_debug_artifacts_async(page, label, base_dir=None, *, full_page=True, include_html=True)[source]

Save a screenshot and (optionally) the page HTML.

Parameters:
  • page (playwright.async_api.Page) – Live page object.

  • label (str) – Short tag used as the filename prefix (e.g. “mfa_picker_before”). Sanitized: non-alphanum chars become “_”.

  • base_dir (path-like or None) – Where to write. Defaults to $SCITEX_DIR/browser/runtime/cache/debug/ (~/.scitex/browser/runtime/cache/debug/ by default).

  • full_page (bool) – Capture the full scrollable page (default True). Pass False for viewport-only.

  • include_html (bool) – Save page.content() alongside the screenshot (default True).

Returns:

Paths actually written, or None on failure.

Return type:

(png_path, html_path)

class scitex_browser.debugging.TestMonitor(output_dir=None, interval=2.0, quality=70, verbose=False, test_name=None)[source]

Bases: object

Monitor E2E tests with periodic screenshots using scitex.capture.

Captures screenshots at regular intervals during test execution, allowing visual inspection of test progress and debugging.

__init__(output_dir=None, interval=2.0, quality=70, verbose=False, test_name=None)[source]

Initialize test monitor.

Parameters:
  • output_dir (str | Path) – Directory for screenshots (default: $SCITEX_DIR/browser/runtime/test_monitor)

  • interval (float) – Seconds between screenshots (default: 2.0)

  • quality (int) – JPEG quality 1-100 (default: 70)

  • verbose (bool) – Print capture messages

  • test_name (str) – Optional test name for session identification

start(test_name=None)[source]

Start periodic screenshot capture.

Parameters:

test_name (str) – Optional test name to include in session

Return type:

str

Returns:

Session ID for this capture session

stop()[source]

Stop screenshot capture.

Return type:

dict

Returns:

Status dict with session info

get_status()[source]

Get current monitor status.

Return type:

dict

take_snapshot(message=None)[source]

Take an immediate snapshot (in addition to periodic captures).

Parameters:

message (str) – Optional message to include in filename

Return type:

Optional[str]

Returns:

Path to saved screenshot

create_gif(duration=0.5, output_path=None)[source]

Create GIF from captured screenshots.

Parameters:
  • duration (float) – Duration per frame in seconds

  • output_path (str) – Output path for GIF (auto-generated if None)

Return type:

Optional[str]

Returns:

Path to created GIF

get_screenshots()[source]

Get list of captured screenshot paths.

Return type:

list

scitex_browser.debugging.create_test_monitor_fixture(output_dir=None, interval=2.0, auto_gif=False)[source]

Create a pytest fixture for test monitoring.

Usage in conftest.py:

from scitex_browser.debugging import create_test_monitor_fixture

test_monitor = create_test_monitor_fixture(interval=2.0, auto_gif=True)

Parameters:
  • output_dir (str | Path) – Directory for screenshots

  • interval (float) – Seconds between screenshots

  • auto_gif (bool) – Create GIF automatically on test completion

Returns:

A pytest fixture function

scitex_browser.debugging.monitor_test(test_func=None, interval=2.0, auto_gif=False)[source]

Decorator for monitoring tests with periodic screenshots.

Usage:

@monitor_test(interval=1.0, auto_gif=True) def test_my_feature(page):

# test code…

Parameters:
  • test_func – Test function (for use without parentheses)

  • interval (float) – Seconds between screenshots

  • auto_gif (bool) – Create GIF on completion

class scitex_browser.debugging.SyncBrowserSession(page, timeout=60, on_enter=None, on_exit=None)[source]

Bases: object

Sync context manager for playwright browser sessions.

Ensures zombie process cleanup on test failures, timeouts, or crashes. Tracks browser PIDs and kills orphaned processes on exit.

__init__(page, timeout=60, on_enter=None, on_exit=None)[source]

Initialize sync browser session.

Parameters:
  • page (Page) – Playwright page instance from pytest-playwright

  • timeout (int) – Default timeout for operations in seconds

  • on_enter (Optional[Callable[[Page], None]]) – Callback when entering context

  • on_exit (Optional[Callable[[Page, bool], None]]) – Callback when exiting context (receives page and success flag)

__enter__()[source]

Enter context - track browser PIDs and run setup callback.

Return type:

SyncBrowserSession

__exit__(exc_type, exc_val, exc_tb)[source]

Exit context - ensure cleanup happens.

Return type:

bool

static _kill_process_tree(pid)[source]

Kill a process and all its children (zombies).

classmethod _emergency_cleanup()[source]

Emergency cleanup of all active sessions on process exit.

static kill_zombie_browsers()[source]

Kill all zombie chromium/chrome processes from failed tests.

Call this at the start of test sessions to clean up from previous runs.

scitex_browser.debugging.sync_browser_session(page, timeout=60, on_enter=None, on_exit=None)[source]

Context manager for sync playwright sessions.

Usage:
with sync_browser_session(page) as session:

session.page.goto(url) # … test code

# Cleanup happens automatically

scitex_browser.debugging.create_browser_session_fixture(timeout=60, setup=None, teardown=None, kill_zombies_on_start=True)[source]

Create a pytest fixture for browser session with cleanup.

Usage in conftest.py:

from scitex_browser import create_browser_session_fixture

browser_session = create_browser_session_fixture(

timeout=60, setup=lambda page: print(f”Starting test”), teardown=lambda page, success: print(f”Test {‘passed’ if success else ‘failed’}”), kill_zombies_on_start=True,

)

Parameters:
  • timeout (int) – Default timeout for operations

  • setup (Optional[Callable[[Page], None]]) – Callback when entering session

  • teardown (Optional[Callable[[Page, bool], None]]) – Callback when exiting (receives page and success flag)

  • kill_zombies_on_start (bool) – Kill orphaned browsers before first test

Returns:

A pytest fixture function