E2E test selector map
Stable test identifiers for Claire’s browser and mobile acceptance flows.
Every stable testID used by the Playwright suite. These are a contract: renaming one breaks tests silently in the sense that they fail for the wrong reason, so change them deliberately and update this page in the same commit.
Auth screens#
Sign in — /(auth)/signin#
| Selector | Element |
|---|---|
signin-screen | Root KeyboardAvoidingView |
signin-email-input | Email TextInput |
signin-password-input | Password TextInput |
signin-submit | Submit TouchableOpacity |
google-sign-in-signin | Google sign-in button |
Sign up — /(auth)/signup#
| Selector | Element |
|---|---|
signup-screen | Root view |
signup-name-input | Name TextInput |
signup-email-input | Email TextInput |
signup-password-input | Password TextInput |
signup-submit | Submit TouchableOpacity |
Platform connect — /(auth)/login#
| Selector | Element |
|---|---|
platform-login-screen | Root View |
platform-selector-whatsapp | WhatsApp selector tile |
platform-selector-telegram | Telegram selector tile |
platform-selector-instagram | Instagram selector tile |
platform-login-continue | “Continue to Inbox” — shown once ≥1 platform is connected |
platform-login-skip-dev | “Skip (dev mode)” — only in __DEV__ |
Tab screens#
Dashboard — /(tabs)/dashboard#
| Selector | Element |
|---|---|
dashboard-screen | Root ScrollView |
morning-brief-container | Wrapper around MorningBrief; only rendered when brief text exists |
urgent-cards-container | Wrapper for UrgentCard rows; only rendered when urgent_messages are present |
Inbox — /(tabs)/messages#
| Selector | Element |
|---|---|
messages-screen | Root View |
messages-loading | Loading spinner |
messages-search-input | Search TextInput |
messages-list | Conversation FlatList |
messages-empty | Empty state |
message-card-<id> | Individual MessageCard row; id is the message UUID |
message-card-loop-badge-<id> | OPEN LOOP badge when the chat has at least one open loop |
Contacts — /(tabs)/contacts#
| Selector | Element |
|---|---|
contacts-screen | Root View |
contacts-search-input | Search TextInput |
contacts-list | Contacts FlatList |
contacts-empty | Empty state |
Loops — /(tabs)/loops#
Verified against apps/client/features/loops/loops-screen.tsx.
| Selector | Element |
|---|---|
loops-screen | Root View |
loops-list | Loops FlatList |
loops-add | Add-loop button in the header |
loops-tab-open | "Open" filter chip |
loops-tab-done | "Completed" filter chip |
loops-tab-waiting | "I’m waiting" filter chip |
loop-item-<id> | Individual loop row |
loop-toggle-<id> | Complete/reopen checkbox on a loop row |
Settings — /(tabs)/settings#
| Selector | Element |
|---|---|
settings-screen | Root ScrollView |
settings-refresh-platforms | Refresh platforms |
settings-add-platform | Add platform |
settings-no-platforms | Empty platforms view |
settings-connect-platform | “Connect Platform” in the empty state |
settings-account | Account row |
settings-notifications | Notifications row |
settings-ai | AI settings row |
settings-logout | Logout row |
connected-platforms-list | Connected platforms view |
connected-platform-<platform> | Platform row, e.g. connected-platform-whatsapp |
reconnect-platform-<platform> | Reconnect button |
disconnect-platform-<platform> | Disconnect button |
Chat screen — /chat/[chatId]#
| Selector | Element |
|---|---|
chat-screen | Root SafeAreaView |
chat-loading | Loading spinner |
chat-message-list | Messages FlatList |
chat-empty | Empty state |
chat-input | Composer TextInput |
chat-send-button | Send button |
AI suggestion strip#
| Selector | Element |
|---|---|
ai-suggestion-strip | Root; only visible when suggestions exist |
ai-suggestion-scroll | Horizontal ScrollView of chips |
ai-suggestion-chip-<index> | Individual suggestion card, 0-based |
ai-suggestion-use-<index> | “Use” — fills the composer |
draft-reply-container | Shown when no stored suggestions exist |
draft-reply-button | Calls /ai/responses/generate on demand |
draft-reply-error | Error text if generation fails |
Platform auth modal#
| Selector | Element |
|---|---|
platform-auth-modal | Modal root |
platform-auth-scroll | Scrollable content |
platform-auth-success | Success state |
platform-auth-error | Error state |
instagram-web-login | Instagram web login root |
instagram-username-input | Username TextInput |
instagram-password-input | Password TextInput |
instagram-toggle-password | Show/hide password |
instagram-sign-in-button | Sign in |
instagram-2fa-input | 2FA code TextInput |
instagram-2fa-submit | 2FA submit |
instagram-try-again | Retry |
instagram-web-login-close | Close |
instagram-native-webview | Native WebView |
instagram-native-login-loading | Native loading view |
instagram-native-login-close | Native close |
Notes#
- Platform-prefixed selectors use the lowercase
Platformenum value. - Dynamic selectors written as
<id>use the entity’s database UUID. - The web build is required for Playwright — see
mobile/playwright.config.mjs.