iOS Simulator Skill
Build, test, and automate iOS applications using accessibility-driven navigation and structured data instead of pixel coordinates.
Quick Start
# 1. Check environment
bash scripts/sim_health_check.sh
# 2. Launch app
python scripts/app_launcher.py --launch com.example.app
# 3. Map screen to see elements
python scripts/screen_mapper.py
# 4. Tap button
python scripts/navigator.py --find-text "Login" --tap
# 5. Enter text
python scripts/navigator.py --find-type TextField --enter-text "user@example.com"All scripts support --help for detailed options and --json for machine-readable output.
21 Production Scripts
Build & Development (2 scripts)
- build_and_test.py - Build Xcode projects, run tests, parse results with progressive disclosure
- Build with live result streaming - Parse errors and warnings from xcresult bundles - Retrieve detailed build logs on demand - Options: --project, --scheme, --clean, --test, --verbose, --json
- log_monitor.py - Real-time log monitoring with intelligent filtering
- Stream logs or capture by duration - Filter by severity (error/warning/info/debug) - Deduplicate repeated messages - Options: --app, --severity, --follow, --duration, --output, --json
Navigation & Interaction (5 scripts)
- screen_mapper.py - Analyze current screen and list interactive elements
- Element type breakdown - Interactive button list - Text field status - Options: --verbose, --hints, --json
- navigator.py - Find and interact with elements semantically
- Find by text (fuzzy matching) - Find by element type - Find by accessibility ID - Enter text or tap elements - Options: --find-text, --find-type, --find-id, --tap, --enter-text, --json
- gesture.py - Perform swipes, scrolls, pinches, and complex gestures
- Directional swipes (up/down/left/right) - Multi-swipe scrolling - Pinch zoom - Long press - Pull to refresh - Options: --swipe, --scroll, --pinch, --long-press, --refresh, --json
- keyboard.py - Text input and hardware button control
- Type text (fast or slow) - Special keys (return, delete, tab, space, arrows) - Hardware buttons (home, lock, volume, screenshot) - Key combinations - Options: --type, --key, --button, --slow, --clear, --dismiss, --json
- app_launcher.py - App lifecycle management
- Launch apps by bundle ID - Terminate apps - Install/uninstall from.app bundles - Deep link navigation - List installed apps - Check app state - Options: --launch, --terminate, --install, --uninstall, --open-url, --list, --state, --json
Testing & Analysis (5 scripts)
- accessibility_audit.py - Check WCAG compliance on current screen
- Critical issues (missing labels, empty buttons, no alt text) - Warnings (missing hints, small touch targets) - Info (missing IDs, deep nesting) - Options: --verbose, --output, --json
- visual_diff.py - Compare two screenshots for visual changes
- Pixel-by-pixel comparison - Threshold-based pass/fail - Generate diff images - Options: --threshold, --output, --details, --json
- test_recorder.py - Automatically document test execution
- Capture screenshots and accessibility trees per step - Generate markdown reports with timing data - Options: --test-name, --output, --verbose, --json
- app_state_capture.py - Create comprehensive debugging snapshots
- Screenshot, UI hierarchy, app logs, device info - Markdown summary for bug reports - Options: --app-bundle-id, --output, --log-lines, --json
- sim_health_check.sh - Verify environment is properly configured
- Check macOS, Xcode, simctl, IDB, Python - List available and booted simulators - Verify Python packages (Pillow)
Advanced Testing & Permissions (4 scripts)
- clipboard.py - Manage simulator clipboard for paste testing
- Copy text to clipboard - Test paste flows without manual entry - Options: --copy, --test-name, --expected, --json
- status_bar.py - Override simulator status bar appearance
- Presets: clean (9:41, 100% battery), testing (11:11, 50%), low-battery (20%), airplane (offline) - Custom time, network, battery, WiFi settings - Options: --preset, --time, --data-network, --battery-level, --clear, --json
- push_notification.py - Send simulated push notifications
- Simple mode (title + body + badge) - Custom JSON payloads - Test notification handling and deep links - Options: --bundle-id, --title, --body, --badge, --payload, --json
- privacy_manager.py - Grant, revoke, and reset app permissions
- 13 supported services (camera, microphone, location, contacts, photos, calendar, health, etc.) - Batch operations (comma-separated services) - Audit trail with test scenario tracking - Options: --bundle-id, --grant, --revoke, --reset, --list, --json
Device Lifecycle Management (5 scripts)
- simctl_boot.py - Boot simulators with optional readiness verification
- Boot by UDID or device name - Wait for device ready with timeout - Batch boot operations (--all, --type) - Performance timing - Options: --udid, --name, --wait-ready, --timeout, --all, --type, --json
- simctl_shutdown.py - Gracefully shutdown simulators
- Shutdown by UDID or device name - Optional verification of shutdown completion - Batch shutdown operations - Options: --udid, --name, --verify, --timeout, --all, --type, --json
- simctl_create.py - Create simulators dynamically
- Create by device type and iOS version - List available device types and runtimes - Custom device naming - Returns UDID for CI/CD integration - Options: --device, --runtime, --name, --list-devices, --list-runtimes, --json
- simctl_delete.py - Permanently delete simulators
- Delete by UDID or device name - Safety confirmation by default (skip with --yes) - Batch delete operations - Smart deletion (--old N to keep N per device type) - Options: --udid, --name, --yes, --all, --type, --old, --json
- simctl_erase.py - Factory reset simulators without deletion
- Preserve device UUID (faster than delete+create) - Erase all, by type, or booted simulators - Optional verification - Options: --udid, --name, --verify, --timeout, --all, --type, --booted, --json
Common Patterns
Auto-UDID Detection: Most scripts auto-detect the booted simulator if --udid is not provided.
Device Name Resolution: Use device names (e.g., "iPhone 16 Pro") instead of UDIDs - scripts resolve automatically.
Batch Operations: Many scripts support --all for all simulators or --type iPhone for device type filtering.
Output Formats: Default is concise human-readable output. Use --json for machine-readable output in CI/CD.
Help: All scripts support --help for detailed options and examples.
Typical Workflow
- Verify environment:
bash scripts/sim_health_check.sh - Launch app:
python scripts/app_launcher.py --launch com.example.app - Analyze screen:
python scripts/screen_mapper.py - Interact:
python scripts/navigator.py --find-text "Button" --tap - Verify:
python scripts/accessibility_audit.py - Debug if needed:
python scripts/app_state_capture.py --app-bundle-id com.example.app
Requirements
- macOS 12+
- Xcode Command Line Tools
- Python 3
- IDB (optional, for interactive features)
Documentation
- SKILL.md (this file) - Script reference and quick start
- README.md - Installation and examples
- CLAUDE.md - Architecture and implementation details
- references/ - Deep documentation on specific topics
- examples/ - Complete automation workflows
Key Design Principles
Semantic Navigation: Find elements by meaning (text, type, ID) not pixel coordinates. Survives UI changes.
Token Efficiency: Concise default output (3-5 lines) with optional verbose and JSON modes for detailed results.
Accessibility-First: Built on standard accessibility APIs for reliability and compatibility.
Zero Configuration: Works immediately on any macOS with Xcode. No setup required.
Structured Data: Scripts output JSON or formatted text, not raw logs. Easy to parse and integrate.
Auto-Learning: Build system remembers your device preference. Configuration stored per-project.
Use these scripts directly or let Claude Code invoke them automatically when your request matches the skill description.