
Appshots Accessibility Ids
- 4 installs
- 1 repo stars
- Updated March 19, 2026
- truongduy2611/app-screenshots-cli-skills
Helps with ai & agent building tasks.
About
appshots-accessibility-ids is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted development.
- appshots-accessibility-ids
- AI & Agent Building
- AI-coding skill
Appshots Accessibility Ids by the numbers
- 4 all-time installs (skills.sh)
- Ranked #13,372 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/truongduy2611/app-screenshots-cli-skills --skill appshots-accessibility-idsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 4 |
|---|---|
| repo stars | ★ 1 |
| Last updated | March 19, 2026 |
| Repository | truongduy2611/app-screenshots-cli-skills ↗ |
What it does
Helps with ai & agent building tasks.
Files
Accessibility Identifiers for Screenshot Automation
Before any automation tool (Maestro or AXe) can reliably tap elements in your app, those elements need stable accessibility identifiers. This skill teaches you how to add them across frameworks.
Why Accessibility Identifiers?
| Without identifiers | With identifiers |
|---|---|
| Tap by coordinates → breaks on different screens | Tap by id: → works everywhere |
| Tap by text → breaks across locales | Identifiers are locale-independent |
| Need trial-and-error | Predictable, documented targets |
Framework Reference
Flutter (3.19+)
Semantics(
identifier: 'settings_button', // ← stable, locale-independent
child: ElevatedButton(
onPressed: () => openSettings(),
child: Text(context.l10n.settings), // ← localized, changes per locale
),
)Semantics.identifier was contributed by the Maestro team in Flutter 3.19.SwiftUI
Button("Settings") {
openSettings()
}
.accessibilityIdentifier("settings_button")UIKit
button.accessibilityIdentifier = "settings_button"Jetpack Compose
Button(
onClick = { openSettings() },
modifier = Modifier.semantics { testTag = "settings_button" }
) {
Text(stringResource(R.string.settings))
}In Compose, usetestTaginsideModifier.semantics { }— Maestro matches this asid:.
Android XML Views
<Button
android:id="@+id/settings_button"
android:contentDescription="@string/settings"
android:tag="settings_button" />Maestro usesandroid:tagas theid:selector for XML views.android:idalone is not enough.
React Native
<TouchableOpacity
testID="settings_button"
accessibilityLabel="Settings"
onPress={openSettings}
>
<Text>{t('settings')}</Text>
</TouchableOpacity>React Native usestestIDwhich maps directly to Maestro'sid:selector.
Naming Conventions
Use a consistent context_element pattern across all frameworks:
# Navigation
tab_home
tab_search
tab_profile
tab_settings
# Feature cards / buttons
feature_camera
feature_scan
feature_create
# List items (indexed)
list_item_0
list_item_1
search_result_0
# In-screen actions
login_submit_button
onboarding_next_button
dialog_confirm_buttonRules
1. Always lowercase with underscores — settings_button, not SettingsButton 2. Prefix with screen/context — Prevents collisions across screens 3. Use indices for lists — list_item_0, search_result_0 4. Avoid localized text — Never use translated strings as identifiers 5. Keep them short but descriptive — tab_home, not bottom_navigation_bar_home_tab_button
Verification
Using Maestro Studio (All Frameworks)
maestro studioOpens a browser UI where you can click elements and see their identifiers.
Using AXe CLI (iOS Only)
axe describe-ui --udid <SIMULATOR_UDID>
axe describe-ui --udid <SIMULATOR_UDID> | grep "settings_button"Framework-Specific Debuggers
| Framework | Debug tool |
|---|---|
| Flutter | showSemanticsDebugger: true in MaterialApp |
| SwiftUI/UIKit | Xcode Accessibility Inspector |
| Android | Layout Inspector → Accessibility pane |
| React Native | Appium Inspector or accessibilityLabel logging |
Minimum Identifiers Checklist
Before running any capture flow, ensure these element types have identifiers:
- [ ] Navigation tabs — every tab bar item
- [ ] Feature cards / CTAs on home screen — primary actions
- [ ] Scrollable content items — cards, list items that need tapping
- [ ] Key action buttons — Play, Start, Submit, Confirm
- [ ] Modal/popup triggers — elements that open detail views
Agent Guidelines
Thinking Process
When asked to "prepare an app for screenshot automation":
1. Identify the framework — Flutter, SwiftUI, UIKit, Compose, XML Android, or React Native 2. Identify screens to capture — List the screenshots needed 3. Map navigation paths — What taps/swipes reach each screen? 4. Find missing identifiers — Check which tappable elements lack identifiers 5. Add identifiers — Use the correct API for the framework (see table above) 6. Rebuild and verify — Build the app, then run maestro studio or axe describe-ui
Common Mistakes to Avoid
- ❌ Adding identifiers to non-interactive widgets (labels, dividers)
- ❌ Using localized strings as identifiers
- ❌ Forgetting to rebuild after adding identifiers
- ❌ Using the same identifier on multiple elements on the same screen
- ❌ Using
android:idwithoutandroid:tagfor XML Android views