From test-plan
Browser-based UI test execution against live ODH/RHOAI clusters. Loads TCs from a GitHub PR or repo folder via ui_prepare.py, executes each via a persistent Playwright browser, and produces a visual HTML report with PASS/FAIL/BLOCKED/INCOMPLETE verdicts and screenshots. Use for verifying UI test cases against live clusters with visual evidence and screenshot capture.
npx claudepluginhub opendatahub-io/skills-registry --plugin test-plan(run after ui_prepare.py - no arguments)This skill uses the workspace's default tool permissions.
Verifies UI test cases against a live ODH/RHOAI cluster. Reads TC-*.md files from a GitHub PR or repository folder, runs browser interactions via the Playwright Python API (persistent CDP browser), and produces a PASS/FAIL/BLOCKED report with highlighted screenshots. Test cases with no UI steps are automatically marked BLOCKED.
README.mdcomponent-registry.yamlelement-map.yamlinstructions.mdjs-patterns.mdrequirements.txtscripts/__init__.pyscripts/browser_common.pyscripts/build_element_map.pyscripts/github_utils.pyscripts/helpers.pyscripts/paths.pyscripts/ui_assert.pyscripts/ui_block.pyscripts/ui_cleanup.pyscripts/ui_collect.pyscripts/ui_interact.pyscripts/ui_prepare.pyscripts/ui_read_ctx.pyscripts/ui_report.pyMandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
Verifies UI test cases against a live ODH/RHOAI cluster. Reads TC-*.md files from a GitHub PR or repository folder, runs browser interactions via the Playwright Python API (persistent CDP browser), and produces a PASS/FAIL/BLOCKED report with highlighted screenshots. Test cases with no UI steps are automatically marked BLOCKED.
# Step 1 — terminal (deterministic setup):
python3 skills/test-plan-ui-verify/scripts/ui_prepare.py \
--test-plan-pr <url> [--tc <filter>] [--priority <P>]
# Step 2 — Claude Code (launched automatically, or type manually):
/test-plan-ui-verify
| Flag | Description |
|---|---|
--test-plan-pr <url> | Load TCs from any open GitHub PR |
--test-plan <path> | Load TCs from a folder in main (e.g. org/repo/feature_folder) |
--tc <filter> | Exact ID (TC-FILTER-001) or category prefix (TC-FILTER, TC-E2E,TC-CARD) |
--priority <P> | P0, P1, or P2 — default: all priorities |
--target-url <url> | Skip route auto-detection, use this URL |
--refresh-map <path> | Regenerate element-map.yaml from odh-dashboard source |
--setup | One-time credential setup wizard |
--upgrade-phase <pre|post> | Upgrade testing: pre saves baseline on old cluster; post compares against baseline on new cluster |
--baseline <session-dir> | Explicit baseline for --upgrade-phase post — pin comparison to a specific prior session (e.g. the original working state when verifying a fix after a broken intermediate run) |
| File | Purpose |
|---|---|
test-variables.yml | Cluster credentials (gitignored — copy from .example) |
element-map.yaml | 1300+ data-testid selectors from dashboard source |
component-registry.yaml | ODH component → URL/auth configuration and known routes |
scripts/ui_prepare.py | Deterministic setup: loads TCs, resolves creds/URL, launches browser, writes context |
scripts/ui_interact.py | Element interaction: click, fill, goto, scroll, expand (auto-relogins on session expiry) |
scripts/ui_assert.py | Assertion runner: banner, screenshot, log, exit code; --inspect for diagnostic-only calls; --click-before to open ephemeral UI (dropdowns, menus) before asserting |
scripts/ui_block.py | Logs BLOCKED/INCOMPLETE verdict entries to the TC log |
scripts/ui_report.py | Generates report.html + report.md per run; for upgrade post-runs also generates upgrade-report.html (FIXED/REGRESSION/STABLE comparison) with a pre-session/ symlink to the baseline |
scripts/github_utils.py | GitHub API helpers: fetch TC files and metadata via gh |
scripts/build_element_map.py | Regenerates element-map.yaml from odh-dashboard source |
All results land in skills/test-plan-ui-verify/results/<session>/:
report.html — visual report: color-coded verdicts, per-TC assertion tables with screenshot thumbnails; open in browserreport.md — plain-text Markdown summary (same content, for GitHub / terminal)TC-*-verify-*.png — highlighted verification screenshots (one per assertion)tc_log.json — raw assertion data (verdict priority: FAIL > INCOMPLETE > BLOCKED > PASS)Upgrade post-runs additionally produce:
upgrade-report.html — side-by-side comparison: FIXED / REGRESSION / STABLE / STILL FAILING / POST-ONLY per TC; links to pre and post individual reportsupgrade-report.md — plain-text version of the comparisonpre-session/ — symlink to the baseline session directory for easy navigationExecution constraints: Never retry the same action more than twice. For route discovery, look up
ctx["known_routes"]first, then try alternatives freely — URL attempts are unlimited. If 3 consecutive tool calls produce no progress, mark the TC INCOMPLETE and move on. Useui_assert.py --inspectfor read-only DOM investigation (never logs to TC log, never mutates DOM). Only callui_assert.pywithout--inspectfor official Expected Results.
Before executing, read the full implementation guide:
Use the Read tool to read instructions.md in this skill's directory, then follow the phases exactly.