android-e2e-testing
- Repo stars 49,853
- Author updated Live
- Author repo expo
- Domain
- Engineering
- Compatible agents
-
- Claude Code
- Cursor
- Cline
- Codex
- Windsurf
- Gemini CLI
- +20
- Trust score
- 88 / 100 · community maintained
- Author / version / license
- @expo · no license declared
- Token usage
- Lean
- Setup complexity
- Guided setup
- External API key
- Not required
- Operating systems
- Unspecified (assume cross-platform)
- Runtime requirements
- No special requirements
- Permissions
-
- Read-only
- Write / modify
- Shell exec
- Network behavior
- Local-only
- Install commands
- 26 variants
Profile is derived at build time from SKILL.md and install vectors. Subject to drift from author intent.
Heads up: 未限定 allowed-tools,默认拥有全部工具权限。
---
name: android-e2e-testing
description: Test Expo Router features on Android emulators using ADB. Use after implementing native Android…
category: engineering
runtime: no special runtime
---
# android-e2e-testing output preview
## PART A: Task fit
- Use case: Test Expo Router features on Android emulators using ADB. Use after implementing native Android features or when verifying UI behavior on Android. Use adb to manually test Expo Router screens and components on Android emulators. runs entirely locally. Works with Claude Code, Cursor, Cline and 23 more..
- Inputs: target material, constraints, expected output, and acceptance criteria.
- Evidence boundary: follow “When to Use / Prerequisites / Step 1: Build and Launch” and do not present inference as author intent.
## PART B: Execution result
- **01** The card summarizes the use case; runtime output centers on “Test Expo Router features on Android emulators using ADB. Use after implementing native Android features or when verifying UI behavior on Android. Use adb to manually test Expo Router screens and components on Android emulators. runs entirely locally. Works with Claude Code, Cursor, Cline and 23 more.”.
- **02** When the source has headings, the agent prioritizes “When to Use / Prerequisites / Step 1: Build and Launch” so the result follows the author’s structure.
- **03** Typical output includes task judgment, concrete steps, required commands or file edits, validation, and follow-up options.
- **04** Risk context follows the fingerprint: read files, write/modify files, run shell commands; mostly runs locally; usually needs no extra API key.
## Running Rules
- read files, write/modify files, run shell commands; mostly runs locally; usually needs no extra API key.
- Validate with a small sample before expanding scope.
- Return the result, validation criteria, and next iteration options. The source mentions slash commands such as `/sdcard`, `/tmp`; use them first when your agent supports command triggers.
Name target files or source material, expected output, forbidden changes, and whether network or shell access is allowed. Permission fingerprint: read files, write/modify files, run shell commands.
Start with a small task and check whether the result follows “When to Use / Prerequisites / Step 1: Build and Launch”. Inspect diffs, logs, previews, or tests before expanding scope.
Confirm the final output includes a concrete result, evidence, and next action. If it stays generic, tighten inputs, boundaries, and acceptance criteria.
---
name: android-e2e-testing
description: Test Expo Router features on Android emulators using ADB. Use after implementing native Android…
category: engineering
source: expo/expo
---
# android-e2e-testing
## When to use
- Test Expo Router features on Android emulators using ADB. Use after implementing native Android features or when verif…
- Use it when the task has clear inputs, repeatable steps, and validation criteria.
## What to provide
- Target material, scope, expected result, and forbidden changes.
- Whether network, commands, file writes, or external services are allowed.
## Execution rules
- Organize steps around “When to Use / Prerequisites / Step 1: Build and Launch” and keep inference separate from source facts.
- read files, write/modify files, run shell commands; mostly runs locally; usually needs no extra API key.
- Validate with a small sample before expanding the task.
## Output requirements
- Return the deliverable, key evidence, validation method, and next action.
- Mark missing information as unknown; do not invent commands, platforms, or dependencies. The author source anchors workflow facts; repository files anchor sources and commands; Fluxly only adds fit, limitations, and quality judgment.
skill "android-e2e-testing" {
input -> user goal + target files + boundaries + acceptance criteria
context -> When to Use / Prerequisites / Step 1: Build and Launch
rules -> SKILL.md triggers / order / output contract
runtime -> no special runtime | read files, write/modify files, run shell commands | mostly runs locally
guardrails -> usually needs no extra API key + small-sample validation + diff/log review
output -> copyable result + checklist + next iteration
} Android E2E Testing for Expo Router
Use adb to manually test Expo Router screens and components on Android emulators.
When to Use
- After implementing or modifying native Android UI components (toolbars, tabs, menus)
- When verifying Jetpack Compose components (
@expo/ui/jetpack-compose) - When running the
native-navigationor other E2E apps on Android - Before opening a PR that touches Android-specific behavior
Prerequisites
An Android emulator must be running. Prefer Pixel emulators over tablet ones for standard phone-sized testing.
# Verify emulator is connected
adb devices
# Check which emulator is running
adb -s DEVICE_ID emu avd name
# Check screen resolution (important for coordinate calculations)
adb -s DEVICE_ID shell wm size
Step 1: Build and Launch
Router E2E apps
Package name: dev.expo.routere2e
Each app in apps/router-e2e/__e2e__/ has a corresponding yarn android:<name> script. Check apps/router-e2e/package.json for available scripts.
cd apps/router-e2e
yarn android:[APP_NAME] # e.g. yarn android:native-navigation
If the app is already built, relaunch it:
adb shell monkey -p dev.expo.routere2e -c android.intent.category.LAUNCHER 1
To find the package name of any installed app:
adb shell pm list packages | grep -i <keyword>
Step 2: Navigate Using UI Dump
CRITICAL: Always use uiautomator dump for element coordinates. Screenshot pixel coordinates have display scaling factors that make them unreliable for adb shell input tap. The UI dump provides actual device coordinates.
Dump the view hierarchy
adb shell uiautomator dump /sdcard/ui.xml && adb shell cat /sdcard/ui.xml
This returns XML with every UI element including:
text— displayed textcontent-desc— accessibility description (useful for icon buttons)bounds— position as[left,top][right,bottom]clickable— whether the element responds to tapsclass— Android view class
Find and tap an element
- Search the XML for your target element by
textorcontent-desc - Extract the
boundsattribute:bounds="[left,top][right,bottom]" - Calculate center:
x = (left + right) / 2,y = (top + bottom) / 2 - Tap:
adb shell input tap <x> <y>
Example: For bounds="[367,498][714,633]":
- x = (367 + 714) / 2 = 540
- y = (498 + 633) / 2 = 565
adb shell input tap 540 565
Wait for navigation to settle
After tapping a navigation element, wait before verifying:
sleep 1
For slow transitions or heavy screens, use sleep 2.
Step 3: Interact
Tap items
adb shell input tap <x> <y>
Scroll
# Scroll down
adb shell input swipe 540 1500 540 500 300
# Scroll up
adb shell input swipe 540 500 540 1500 300
# Scroll further (larger distance)
adb shell input swipe 540 1500 540 200 500
Type text
adb shell input text "hello%sworld" # %s = space
Press hardware buttons
adb shell input keyevent 4 # Back
adb shell input keyevent 3 # Home
adb shell input keyevent 82 # Menu / React Native dev menu
Long press
adb shell input swipe <x> <y> <x> <y> 1000
Step 4: Verify
Visual verification via screenshot
adb shell screencap -p /sdcard/screenshot.png && adb pull /sdcard/screenshot.png /tmp/screenshot.png
Then use the Read tool to view /tmp/screenshot.png. Screenshots are useful for:
- Confirming visual appearance (colors, layout, styling)
- Verifying toolbar/tab positioning
- Checking selection states and visual feedback
Note: Use screenshots for visual verification only. For element positions and tapping, always use uiautomator dump.
Programmatic verification via UI dump
adb shell uiautomator dump /sdcard/ui.xml && adb shell cat /sdcard/ui.xml
Search the XML for expected content:
- Verify text content appears
- Check
content-descfor accessibility labels - Confirm element presence after navigation
- Verify selection states (look for checkmarks, content-desc changes)
Check for errors
# React Native JS errors
adb logcat -d -s ReactNativeJS:E | tail -20
# Crash logs
adb logcat -b crash -d
# All recent errors
adb logcat -d *:E | tail -30
Step 5: Report Results
After testing, summarize results in a table:
| Test | Result |
|---|---|
| Navigation to screen | PASS/FAIL |
| Component renders correctly | PASS/FAIL |
| Interaction works | PASS/FAIL |
| No JS errors in logcat | PASS/FAIL |
Include details for any failures: what was expected vs what happened, relevant logcat output, and screenshots.
Preferably attach screenshots for features you tested.
Testing Jetpack Compose Components
Components from @expo/ui/jetpack-compose (like HorizontalFloatingToolbar, IconButton, Host) render as Compose views inside React Native. In UI dumps they appear as:
androidx.compose.ui.platform.ComposeView— the Compose containerandroid.widget.HorizontalScrollView— inside toolbar layoutsandroid.widget.Button— Compose buttonsandroid.view.Viewwithcontent-desc— icon buttons with accessibility labels
When testing Compose components:
- Look for
content-descattributes to identify buttons (e.g.,content-desc="Clear selection") - The
ComposeViewwrapper may have different bounds than the inner interactive elements - Tap the interactive element's bounds, not the container's
Troubleshooting
uiautomator dump fails or returns empty
This can happen during animations or transitions. Wait and retry:
sleep 2 && adb shell uiautomator dump /sdcard/ui.xml && adb shell cat /sdcard/ui.xml
Tap doesn't register
- Recalculate coordinates from a fresh UI dump — the layout may have shifted
- Ensure you're tapping a
clickable="true"element - Try tapping the parent element if the child isn't clickable
App navigated to wrong screen or went to home
- The Back button (
keyevent 4) can exit the app entirely if on the root screen - Use
monkeycommand to relaunch:adb shell monkey -p dev.expo.routere2e -c android.intent.category.LAUNCHER 1 - Wait 2 seconds after launch before interacting
Metro bundler not connecting
adb reverse tcp:8081 tcp:8081
App crashes on launch
# Check crash buffer
adb logcat -b crash -d
# Look for fatal exceptions
adb logcat -d | grep -A 10 "FATAL EXCEPTION"
Reload the app
# Open React Native dev menu and tap Reload
adb shell input keyevent 82
# Or force-stop and relaunch
adb shell am force-stop dev.expo.routere2e && adb shell monkey -p dev.expo.routere2e -c android.intent.category.LAUNCHER 1
Disable Animations (Recommended for Testing)
Disabling animations prevents flaky UI dumps and makes testing more reliable:
adb shell settings put global window_animation_scale 0
adb shell settings put global transition_animation_scale 0
adb shell settings put global animator_duration_scale 0
Re-enable when done:
adb shell settings put global window_animation_scale 1
adb shell settings put global transition_animation_scale 1
adb shell settings put global animator_duration_scale 1
Complete Example: Testing a Toolbar Screen
# 1. Launch app
adb shell monkey -p dev.expo.routere2e -c android.intent.category.LAUNCHER 1
sleep 2
# 2. Dump UI to find navigation button
adb shell uiautomator dump /sdcard/ui.xml && adb shell cat /sdcard/ui.xml
# Find: content-desc="Android Toolbar" bounds="[367,498][714,633]"
# Center: (540, 565)
# 3. Navigate to screen
adb shell input tap 540 565
sleep 1
# 4. Take screenshot to verify visual appearance
adb shell screencap -p /sdcard/screenshot.png && adb pull /sdcard/screenshot.png /tmp/screenshot.png
# 5. Dump UI to find toolbar buttons
adb shell uiautomator dump /sdcard/ui.xml && adb shell cat /sdcard/ui.xml
# Find buttons by content-desc: "Clear selection", "Select all", "Delete", "Add"
# 6. Test toolbar interactions
adb shell input tap 457 2233 # "Select all" button center
sleep 1
# 7. Verify state changed
adb shell screencap -p /sdcard/screenshot.png && adb pull /sdcard/screenshot.png /tmp/screenshot.png
# 8. Check for errors
adb logcat -d -s ReactNativeJS:E | tail -20
Decide Fit First
Design Intent
How To Use It
Boundaries And Review