RIPDPI's own Compose conventions: ViewModel pattern, Route/Screen split, DataStore->StateFlow, RipDpiThemeTokens. Use for how this app does Compose, not generic Compose API questions (see compose).
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
RIPDPI Appium failure triage: flaky tests, locator/session/wait issues, screenshot and element-tree debugging. Use when an Appium test fails or is flaky.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
설치 방법 보기설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
Systematic troubleshooting for failing or flaky Appium tests in the RIPDPI suite.
Work through in order -- stop at the first failure:
curl -s http://127.0.0.1:4723/status | jq .value.readyadb devices -l (should show at least one device)adb shell pm list packages | grep ripdpistart_route value in Route.kt sealed classapp/src/main/kotlin/com/poyka/ripdpi/ui/testing/RipDpiTestTags.kt and docs/automation/selector-contract.md, then confirm the tag is actually attached in Compose sourceappium-automation-contract skill| Symptom | Cause | Fix |
|---|---|---|
NoSuchElementException | Element not on screen, wrong tag, or needs scroll | Verify tag matches Modifier.testTag() in Compose source. Use scroll_to() if below viewport. |
TimeoutException from wait_for | Screen didn't load or element not rendered | Check automation contract params -- wrong start_route or data_preset. Increase timeout for slow emulators. |
StaleElementReferenceException | Compose recomposition invalidated element reference | Re-find the element after any action that triggers recomposition. Don't store element references across interactions. |
| Session creation fails | Appium server down, UiAutomator2 driver missing, or no device | Run triage checklist steps 1-3. Install driver: appium driver install uiautomator2. |
| Passes locally, fails in CI | Animation timing, slower emulator, permission state | Verify disable_motion=True in marker. Check CI emulator specs. Increase timeout if needed. |
| Wrong screen appears | Incorrect start_route or route not handled in contract | Verify route exists in Kotlin Route class. Check data_preset matches screen requirements. |
| Element found but tap has no effect | Element overlapped by another, or animation in progress | Wait for animations to settle. Check if a dialog/overlay is blocking. Use wait_for before tap. |
Step-by-step:
for i in {1..5}; do pytest tests/test_XX.py::test_name -v; done
reset_state=True in marker.disable_motion=True.appium/screenshots/{test_name}.png show what was actually displayed.print(driver.page_source) temporarily to dump the XML tree and search for the expected resource-id.# In test or debug session:
source = driver.page_source
assert "com.poyka.ripdpi:id/{tag}" in source, f"Tag '{tag}' not in element tree"
adb shell uiautomator dump /sdcard/ui.xml
adb pull /sdcard/ui.xml
rg "resource-id" ui.xml # Search for specific IDs
# Find which composable sets the testTag
rg '{tag}|RipDpiTestTags\\.' app/src/main/kotlin/
If the tag is not found, the composable is missing Modifier.testTag("{tag}") -- this is the root cause and must be fixed in the Kotlin source, not the test.
The conftest.py fixture saves screenshots on failure:
appium/screenshots/{test_name}.pnglaunch_app fixture when rep_call.failed is True| Problem | Solution |
|---|---|
| Element appears after animation | Use wait_for(tag, timeout=10) not find(tag) |
| Element appears after network call | Increase to wait_for(tag, timeout=15) |
| Element below viewport | Use scroll_to(tag) before interacting |
| Element disappears after action | Use is_visible(tag, timeout=3) with assert not |
| Screen takes long to load | Only increase timeout in conftest.py launch wait (15s), not in individual tests |
| Element exists in DOM but not rendered | Use is_visible() which checks presence, not just DOM |
| Mistake | Fix |
|---|---|
Adding time.sleep() to fix timing | Use wait_for() or is_visible() with appropriate timeout |
| Increasing all timeouts globally | Identify the specific slow element and adjust only that call |
Ignoring reset_state=True | Stale state from previous test causes cascading failures |
| Catching exceptions to hide failures | Let exceptions propagate; fix the root cause |
| Re-running flaky test without diagnosis | Classify the failure type first (timing/state/animation) |
.agents/skills/appium-automation-contract/SKILL.md -- Preset values and launch flow.agents/skills/appium-test-authoring/SKILL.md -- Conventions for writing tests and page objects.agents/skills/android-device-debug/SKILL.md -- ADB commands, logcat, emulator management아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
RIPDPI's own Compose conventions: ViewModel pattern, Route/Screen split, DataStore->StateFlow, RipDpiThemeTokens. Use for how this app does Compose, not generic Compose API questions (see compose).
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
ADB-based RIPDPI device/emulator debugging: build/install/launch, logcat filtering, fixture port-forwarding, instrumented tests, crash/ANR triage. Use when debugging on a real device or emulator.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
RIPDPI Appium launch-contract reference: start routes and permission/service/data presets. Use when a test launches to the wrong screen or a new automation route is added. General flakiness: appium-test-debug.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
RIPDPI Appium test authoring: page objects, resource-id locators, assertions, wait tiers. Use when writing a new Appium test or page object, or adding coverage for a new screen.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Add or modify a GitHub Actions job. Use when editing a file under .github/workflows/. Not for running a workflow locally (local-ci-act) or release signing (release-signing).
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Conservative review of end-user legal exposure from diagnostics targets and probe hosts, by jurisdiction. Use when shipping or editing diagnostics target lists, probe hosts, or bootstrap endpoints.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.