用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/EvanBacon/apple-health --skill device-testing命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
| name | device-testing |
| description | Interact with iOS simulators and verify app behavior using xcobra |
Use bunx xcobra to interact with iOS simulators and debug Expo apps.
Get the accessibility tree to understand current screen state:
bunx xcobra sim xml
This returns XML with all UI elements, their labels, identifiers, and positions. Use this to:
Tap by accessibility label (preferred):
bunx xcobra sim tap --label "Submit"
Tap by accessibility identifier:
bunx xcobra sim tap --id "submit-button"
Tap by coordinates:
bunx xcobra sim tap --x 200 --y 400
Add delays for animations:
bunx xcobra sim tap --label "Next" --pre-delay 500 --post-delay 300
Type text into focused input:
bunx xcobra sim type "Hello World"
Type from stdin:
echo "test@example.com" | bunx xcobra sim type --stdin
Preset gestures:
bunx xcobra sim gesture scroll-up
bunx xcobra sim gesture scroll-down
bunx xcobra sim gesture swipe-from-left-edge
Custom swipe:
bunx xcobra sim swipe --start-x 200 --start-y 400 --end-x 200 --end-y 100
Press hardware buttons:
bunx xcobra sim button home
bunx xcobra sim button lock
bunx xcobra sim button siri
Capture screenshot:
bunx xcobra sim screenshot --output screenshot.png
Record simulator video:
bunx xcobra sim record-video --output recording.mp4
Execute JS in the running Expo app:
bunx xcobra expo eval "Date.now()"
Get app state:
bunx xcobra expo eval "global.__REDUX_STORE__?.getState()"
Call exposed functions:
bunx xcobra expo eval "globalThis.testHelper?.getCurrentRoute()"
Stream console output:
bunx xcobra expo console
JSON format for parsing:
bunx xcobra expo console --json
Monitor network requests:
bunx xcobra expo network
Trigger a reload to refresh the JavaScript bundle:
bunx xcobra expo reload
This is useful when:
View latest crash:
bunx xcobra crash latest
List recent crashes:
bunx xcobra crash list
Show specific crash:
bunx xcobra crash show <crash-id>
List loaded scripts:
bunx xcobra expo src scripts
Get source code by script ID:
bunx xcobra expo src source <script-id>
List Metro modules:
bunx xcobra expo src modules
List all simulators:
bunx xcobra sim list
Target specific simulator:
bunx xcobra sim tap --udid "DEVICE-UDID" --label "OK"
Get current UI state
bunx xcobra sim xml
Perform action
bunx xcobra sim tap --label "Login"
Wait and verify
sleep 1
bunx xcobra sim xml | grep "Welcome"
Check for errors
bunx xcobra expo console --json | head -20
After navigating, verify you're on the expected screen:
# Check for expected text content
bunx xcobra sim xml | grep -i "expected title"
# Get full accessibility tree and search for elements
bunx xcobra sim xml > /tmp/ui.xml && cat /tmp/ui.xml
Use JavaScript eval to check the current route:
bunx xcobra expo eval "window.location?.pathname"
If deep links navigate to the wrong screen or you see unexpected content:
1. Check the current route in the app:
bunx xcobra expo eval "globalThis.testHelper?.getCurrentRoute()"
2. Verify the app directory structure:
Look for unexpected index routes that may be intercepting navigation:
# List all index files - these define default routes
find app -name "index.tsx" -o -name "index.ts" -o -name "index.js"
# Check for index routes inside groups that may override expected behavior
find app -path "*/(*)/*" -name "index.*"
3. Common issues:
app/(tabs)/index.tsx will be the default route for the (tabs) group, potentially overriding app/index.tsx_layout.tsx to properly nest routes4. Verify route structure matches expectations:
# List all route files
find app -name "*.tsx" | grep -v "_layout" | sort
# Check group structure
find app -type d -name "(*)"`
5. Test deep link resolution:
# Open a deep link and immediately check the route
xcrun simctl openurl booted "myapp://settings" && sleep 1 && bunx xcobra expo eval "window.location?.pathname"
Add global helpers in your app for testing:
if (__DEV__) {
globalThis.testHelper = {
getCurrentRoute: () => navigationRef.current?.getCurrentRoute(),
getState: () => store.getState(),
resetApp: () => { /* reset logic */ },
};
}
Then call via eval:
bunx xcobra expo eval "testHelper.getCurrentRoute()"
基于 SOC 职业分类