Plugin check: Run
node "${CLAUDE_PLUGIN_ROOT}/scripts/check-version.js"— if it outputs a message, show it to the user before proceeding.
Test Power Pages Site
Test a deployed, activated Power Pages site at runtime. Navigate the site in a browser, crawl all discoverable links, verify pages load correctly, capture network traffic to test API requests, and generate a comprehensive test report.
Prerequisite: This skill expects a deployed and activated Power Pages site. Run
/deploy-siteand/activate-sitefirst if the site is not yet live.
Core Principles
- Non-destructive: This skill is read-only — it does not create, modify, or delete any files or data. It only observes the site via the browser.
- API-first testing: The primary goal beyond page loads is verifying that all
/_api/(Web API / OData) requests return successful responses. - Response-shape discovery: For
/_api/serverlogics/endpoints the test run must also capture and report the actual response body shape so frontend integrations can be written against the real response, not a guessed one. If frontend parsing or field access does not match the observed shape, report the mismatch and describe the parsing or field-access changes needed — this skill does not modify any code. - User-controlled authentication: Never attempt to log in automatically. Always ask the user to log in via the browser window when authentication is required.
- Bounded crawling: Cap page crawling at 25 pages to prevent infinite loops on sites with dynamic or paginated URLs.
Validation Test Categories
Every run produces a categorized test report (docs/alm/last-test-site.json — see Phase 6.7a). Stable category IDs and the source phase that produces each:
Category id | Display Name | Source phase | What it covers |
|---|---|---|---|
site-load | Site Load | Phase 2 | Homepage HTTP status, redirect handling, initial render. One card for the homepage; failures are critical. |
authentication | Authentication | Phase 3 | Anonymous-to-Entra redirect, private-site gate detection, login flow integrity. Critical for private sites. |
page-crawl | Page Crawl | Phase 4 | One card per page tested (up to 25). Each card carries the page URL, HTTP status, and any console errors. Severity scales with HTTP class (5xx → critical, 4xx on public → high). |
web-api | Web API | Phase 5 | One card per /_api/ endpoint observed during the run. Captures status code, response shape, and remediation hints (table-permissions / site-settings / inner-error settings). |
auth-pages | Authenticated Pages | Phase 5.6 | Pages that only became reachable after login. Skipped when the user opts out of authenticated testing. |
auth-api | Authenticated API | Phase 5.6 | API endpoints that only became callable after login. Skipped when authenticated testing is skipped. |
console | Console Health | Aggregated | Rolled-up count of console errors observed across all phases. Severity is medium by default. |
plan-alm's Validation tab consumes this shape directly — each category becomes a collapsible group in the per-stage sub-tab, and the rolled-up runOutcome (passed / passed-with-warnings / failed) drives the green / yellow / red Outcome badge in both the Validation tab and the Execution checklist substep.
Initial request: $ARGUMENTS
Phase 1: Resolve Site URL
Goal: Determine the live URL of the Power Pages site to test.
Actions
1.1 Create Task List
Create the full task list with all 6 phases before starting any work (see Progress Tracking table).
1.2 Check User Input
If the user provided a URL in $ARGUMENTS:
- Validate it starts with
https://. - Store it as
SITE_URLand skip to Phase 2.
1.3 Auto-Detect from Activation Status
If no URL was provided, attempt auto-detection:
-
Locate the project root by searching for
powerpages.config.json:**/powerpages.config.json -
Run the activation status check script:
node "${CLAUDE_PLUGIN_ROOT}/scripts/check-activation-status.js" --projectRoot "<PROJECT_ROOT>" -
Evaluate the JSON result:
- If
activatedistrueandwebsiteUrlis present: UsewebsiteUrlasSITE_URL. Inform the user: "Detected your site URL: <websiteUrl>" - If
activatedisfalse: Inform the user: "Your site is not yet activated. Please run/activate-sitefirst, then re-run this skill." Stop the skill. - If
erroris present: Fall through to step 1.4.
- If
1.4 Ask the User
<!-- not-a-gate: site-URL fallback prompt — data-gathering when auto-detection fails; no Dataverse/state change -->If auto-detection failed or was inconclusive, use AskUserQuestion:
| Question | Header | Options |
|---|---|---|
| What is the URL of the deployed Power Pages site you want to test? (e.g., https://contoso.powerappsportals.com) | Site URL | I'll paste the URL (description: Select "Other" below and paste your site URL), I don't know my URL (description: Run /activate-site to get your site URL, or check the Power Platform admin center) |
Store the user-provided URL as SITE_URL.
Output
SITE_URLresolved and ready for testing
Phase 2: Launch Browser & Initial Load
Goal: Open the site in a browser, verify the homepage loads, and capture baseline errors.
Actions
2.1 Resize Browser
Set the browser to a standard desktop viewport:
- Use
browser_resizewith width: 1280, height: 720.
2.2 Navigate to Site
- Use
browser_navigateto openSITE_URL.
2.3 Wait for Page Load
- Use
browser_wait_forwith time: 5 seconds to allow the page to fully render (SPAs may need time for client-side routing and API calls).
2.4 Verify Homepage
- Use
browser_snapshotto take an accessibility snapshot. - Check the snapshot for signs of a working page:
- Page has meaningful content (not blank, not a generic error page).
- Look for common error indicators: "404", "Page not found", "500", "Internal Server Error", "This site can't be reached".
- If the page shows an error, report it to the user and ask whether to continue or stop.
2.5 Capture Console Errors
- Use
browser_console_messageswith level: "error" to check for JavaScript errors on initial load. - Record any errors found — these will be included in the final report.
2.6 Capture Initial Network Requests
- Use
browser_network_requestswith includeStatic: false to capture the initial page load API calls. - Record any
/_api/or OData requests and their status codes for Phase 5 analysis.
Output
- Browser launched at correct viewport size
- Homepage loaded and verified via snapshot
- Initial console errors and network requests recorded
- If the homepage shows a login screen, noted for Phase 3
Phase 3: Authentication Check
Goal: Detect if the site requires authentication and handle login if needed. Power Pages sites can have two layers of authentication:
- Private site gate — The entire site is private. Navigating to the site redirects to an identity provider (Azure AD B2C, etc.) before any site content is visible. The browser URL will typically change to a different domain (e.g.,
login.microsoftonline.com,*.b2clogin.com). - Site-level authentication — The site is publicly accessible (homepage loads), but certain pages or features require a logged-in user with a specific web role. Indicated by "Sign in" / "Log in" links in the navigation, or pages that show restricted-access messages.
Actions
3.1 Analyze Homepage Snapshot for Private Site Gate
Review the browser snapshot from Phase 2.4 and the current browser URL for signs of a private site redirect:
- The page content shows an identity provider login form (Azure AD B2C, Azure AD, etc.)
- The browser URL has changed to a different domain