Playwright UI Testing (MCP)
Verify UI for $ARGUMENTS.
Prerequisites
- Dev server running:
go run .(backend on :3000) +pnpm dev(Vite on :5173) - Playwright MCP configured in
.claude.json:"playwright": { "type": "stdio", "command": "npx", "args": ["@playwright/mcp@latest"] }
Available MCP Tools
Navigation
| Tool | Purpose |
|---|---|
browser_navigate |
Go to a URL |
browser_navigate_back |
Browser back button |
browser_tabs |
List, create, close, select tabs |
Page Inspection
| Tool | Purpose |
|---|---|
browser_snapshot |
Accessibility tree of current page (primary inspection tool) |
browser_take_screenshot |
Visual screenshot |
browser_console_messages |
JavaScript console output |
browser_network_requests |
All network requests since page load |
Interaction
| Tool | Purpose |
|---|---|
browser_click |
Click an element (by accessibility ref or selector) |
browser_type |
Type text into an input |
browser_fill_form |
Fill multiple form fields at once |
browser_select_option |
Select dropdown option |
browser_press_key |
Press keyboard key (Enter, Escape, Tab, etc.) |
browser_hover |
Hover over element |
browser_drag |
Drag and drop between elements |
browser_file_upload |
Upload files |
browser_handle_dialog |
Accept/dismiss dialogs |
Assertions
| Tool | Purpose |
|---|---|
browser_verify_text_visible |
Verify text appears on page |
browser_verify_element_visible |
Verify element is visible |
browser_verify_list_visible |
Verify a list of items is visible |
browser_verify_value |
Verify input/element value |
Utilities
| Tool | Purpose |
|---|---|
browser_wait_for |
Wait for text or timeout |
browser_evaluate |
Run JavaScript in page context |
browser_resize |
Resize viewport (responsive testing) |
browser_close |
Close the browser |
Standard Workflow
Step 1: Navigate to App
browser_navigate → http://localhost:5173/login
Step 2: Login
browser_snapshot → Find email/password fields
browser_fill_form → { email: "admin@example.com", password: "password" }
browser_click → "Sign In" button
browser_wait_for → Wait for dashboard text or redirect
Step 3: Navigate to Target Page
browser_navigate → http://localhost:5173/admin/books
browser_snapshot → Inspect page structure
UI Integrity Checks
1. Page Structure Check
Verify the admin layout renders correctly:
browser_navigate → /admin/{page-name}
browser_snapshot → Check for:
Expected elements on every admin page:
- Sidebar navigation (AppSidebar)
- Site header with page title
- Footer with copyright and version
- Main content area
Verify with:
browser_verify_text_visible → page title (from i18n)
browser_verify_element_visible → sidebar
browser_verify_text_visible → copyright text in footer
2. Navigation Check
Verify sidebar links work:
browser_snapshot → Find nav items in sidebar
browser_click → target nav item
browser_wait_for → new page title
browser_verify_text_visible → expected page heading
3. CRUD Page Check
For entity pages using CrudPage:
List view:
browser_navigate → /admin/entity-names
browser_snapshot → Verify:
- Page title
- "Add" button (if canCreate)
- Data table with columns
- Pagination controls
- Search input
browser_verify_text_visible → column headers
Create form:
browser_click → "Add" / "Create" button
browser_snapshot → Verify form opened with:
- All required field labels
- Input fields, dropdowns, textareas
- Submit button
- Cancel button
Fill and submit:
browser_fill_form → { field1: "value1", field2: "value2" }
browser_select_option → status dropdown
browser_click → Submit button
browser_wait_for → success toast message
Detail view:
browser_click → row in table (or eye icon)
browser_snapshot → Verify:
- All field labels and values displayed
- Status badge
- Metadata (ID, created, updated)
- Edit/Delete action buttons
Edit form:
browser_click → Edit button
browser_snapshot → Verify:
- Form pre-populated with current values
- Same fields as create form
- Metadata section (ID, created, updated)
browser_fill_form → { field1: "updated value" }
browser_click → Save/Update button
browser_wait_for → success toast
Delete:
browser_click → Delete button
browser_handle_dialog → accept confirmation
browser_wait_for → deletion toast or row disappears
4. Global Search (CMD+K)
browser_press_key → Meta+k (Mac) or Control+k
browser_snapshot → Verify search dialog opened:
- Search input with placeholder
- Quick access section with entity links
browser_type → search query text
browser_wait_for → search results
browser_snapshot → Verify:
- Results with entity type badges
- Result titles and subtitles
- Keyboard navigation hints (↑↓ Enter ESC)
browser_click → a search result
browser_wait_for → navigation to result page
5. Responsive Layout Check
# Desktop
browser_resize → { width: 1280, height: 720 }
browser_snapshot → Verify full sidebar, desktop columns
# Tablet
browser_resize → { width: 768, height: 1024 }
browser_snapshot → Verify sidebar collapsed, responsive table
# Mobile
browser_resize → { width: 375, height: 812 }
browser_snapshot → Verify mobile layout, hamburger menu, mobile columns
6. Form Validation Check
# Submit empty form
browser_click → Submit button (without filling required fields)
browser_snapshot → Verify:
- Validation error messages appear
- Error borders on required fields
- Form does NOT submit
# Submit invalid data
browser_fill_form → { email: "not-an-email", price: "abc" }
browser_click → Submit button
browser_snapshot → Verify field-level error messages
7. Permission Gating Check
# Login as user without permissions
browser_navigate → /login
browser_fill_form → { email: "limited@example.com", password: "password" }
browser_click → Sign In
# Verify restricted items
browser_navigate → /admin/entity-names
browser_snapshot → Verify:
- No "Add" button (if no create permission)
- No edit/delete actions (if no update/delete permission)
- Or: 403 page if no read permission
# Verify nav items hidden
browser_snapshot → Check sidebar doesn't show restricted nav items
8. i18n Verification
Check that no raw translation keys appear on the page:
browser_snapshot → Scan for untranslated keys like:
- "page.title" (literal key instead of value)
- "form.name" or "columns.status"
- Any text starting with common i18n prefixes
Entity-Specific Checks
For a New Entity Page
Run these checks after scaffolding with /inertia-scaffold:
- Page loads: Navigate to
/admin/entity-names, verify no errors - Title correct: Page title from i18n renders
- Columns display: Table columns match expected headers
- Create form: All fields present, dropdowns populated, validation works
- Edit form: Pre-populated with data, same fields as create
- Detail view: All fields displayed with labels
- Search: Entity appears in CMD+K results
- Nav entry: Sidebar shows entity link
- Responsive: Mobile columns render on small viewport
- No hardcoded strings: All text from i18n (no raw keys visible)
Debugging
Check Console Errors
browser_console_messages → Look for:
- React errors (hooks, key warnings)
- Network errors (404, 500)
- TypeScript runtime errors
- i18n missing key warnings
Check Network Requests
browser_network_requests → Look for:
- Failed API calls (4xx, 5xx)
- Slow requests (> 2s)
- Missing endpoints
Evaluate Page State
browser_evaluate → document.title
browser_evaluate → JSON.stringify(window.__INERTIA_PAGE__)
Common Patterns
Login Helper Flow
Every test session starts with login:
1. browser_navigate → /login
2. browser_snapshot → find form
3. browser_fill_form → credentials
4. browser_click → submit
5. browser_wait_for → dashboard or redirect
Assert Toast Message
After CRUD operations:
browser_wait_for → "created successfully" or "updated successfully"
# Or use snapshot to find Sonner toast
browser_snapshot → look for toast/notification element
Wait for Data Load
After navigation:
browser_wait_for → table row text or "No results" message
# Or wait for specific content
browser_verify_text_visible → expected content
Verification Report
After completing checks, produce:
- Pages tested: List of URLs visited
- Pass/Fail: For each check category
- Console errors: Any JS errors found
- Missing elements: Expected UI not found
- i18n issues: Untranslated keys visible
- Responsive issues: Layout problems at different viewports
- Screenshots: Key states captured
Reference
- Admin layout:
resources/js/layouts/Admin.tsx - Sidebar:
resources/js/components/app-sidebar.tsx - CrudPage:
resources/js/components/Crud/CrudPage.tsx - Global search:
resources/js/components/GlobalSearch.tsx - Login form:
resources/js/components/login-form.tsx - Books (canonical page):
resources/js/pages/Books/Index.tsx
Converted and distributed by TomeVault — claim your Tome and manage your conversions.