outside-in-testing-ios-apps
npx skills add https://github.com/mikekelly/outside-in-testing-ios-apps --skill outside-in-testing-ios-apps
Agent 安装分布
Skill 文档
Installation (prerequisite):
brew install cameroncooke/axe/axe
The iOS Simulator must be running with the app under test.
<quick_start>
- Find the simulator:
axe list-simulatorsâ look for a Booted simulator, capture its UDID - Screenshot current state:
axe screenshot --udid {UDID} --output /tmp/screen.png - Describe the UI:
axe describe-ui --udid {UDID} - Interact:
axe tap --label "Button" --udid {UDID} - Repeat: screenshot â describe â interact â verify </quick_start>
Observe
- Take a screenshot:
axe screenshot --udid {UDID} --output /tmp/screen.png - Read the accessibility tree:
axe describe-ui --udid {UDID} - To inspect a specific point:
axe describe-ui --point 100,200 --udid {UDID}
Act â choose based on what you need to do:
- Tap by accessibility label:
axe tap --label "Login" --udid {UDID} - Tap by accessibility identifier:
axe tap --id "loginButton" --udid {UDID} - Tap by coordinates (fallback):
axe tap -x 200 -y 400 --udid {UDID} - Type text:
axe type 'user@example.com' --udid {UDID} - Type from stdin:
echo "text" | axe type --stdin --udid {UDID} - Type from file:
axe type --file input.txt --udid {UDID} - Scroll:
axe gesture scroll-down --udid {UDID} - Swipe:
axe swipe --start-x 200 --start-y 500 --end-x 200 --end-y 200 --duration 0.3 --udid {UDID} - Advanced touch (hold):
axe touch -x 150 -y 250 --down --up --delay 1.0 --udid {UDID} - Press key:
axe key 40 --udid {UDID}(Enter) - Key sequence:
axe key-sequence --keycodes 11,8,15,15,18 --udid {UDID} - Home button:
axe button home --udid {UDID} - Siri:
axe button siri --udid {UDID}
Verify After each action, take a screenshot and check whether the expected change occurred. If something is wrong, note the issue and investigate.
Timing controls â add delays when animations or loading cause flakiness:
--pre-delay 0.5â wait before acting--post-delay 1.0â wait after acting--duration 0.3â control gesture speed
<gesture_presets>
Available preset gestures (use with axe gesture {preset} --udid {UDID}):
scroll-up,scroll-down,scroll-left,scroll-rightswipe-from-left-edge,swipe-from-right-edgeswipe-from-top-edge,swipe-from-bottom-edge
For specific screen sizes: axe gesture swipe-from-left-edge --screen-width 430 --screen-height 932 --udid {UDID}
</gesture_presets>
<diagnosing_failures> When the app is not behaving as expected, fetch simulator logs to diagnose:
# Stream logs from the booted simulator (Ctrl+C to stop)
xcrun simctl spawn booted log stream --level debug --predicate 'subsystem == "com.apple.UIKit" OR processImagePath CONTAINS "{APP_NAME}"' 2>&1 | head -200
# Get recent log entries
xcrun simctl spawn booted log show --last 5m --predicate 'processImagePath CONTAINS "{APP_NAME}"' --style compact
# Check for crash logs
ls ~/Library/Logs/DiagnosticReports/*{APP_NAME}* 2>/dev/null
Replace {APP_NAME} with the app’s process name (visible in describe-ui output or from xcrun simctl listapps booted).
If this is a React Native app, invoke the debugging-react-native skill (https://github.com/mikekelly/debugging-react-native) for React Native-specific diagnosis including Metro bundler issues, JS errors, and red box screens.
</diagnosing_failures>
<success_criteria> Testing is complete when:
- App launched and initial screen verified via screenshot
- Core user flows exercised (navigate, interact, verify outcomes)
- Key interactive elements respond correctly
- No crashes or unhandled errors encountered (or failures diagnosed via logs)
- Findings documented: what worked, what failed, and why </success_criteria>