Test IDs Reference
This page documents the stable data-testid attributes used throughout PassTheNote for reliable automation testing. All components maintain consistent test IDs across releases to ensure your test suites remain stable.
Test ID Schema v1.0411 documented IDs • 11 modules • Stable as of December 2025
Authentication
/auth/*| Test ID | Element | Purpose |
|---|---|---|
| ptn-login-page | div | Login page container |
| ptn-login-email-input | input | Email input field |
| ptn-login-password-input | input | Password input field |
| ptn-login-error-alert | div | Error alert message |
| ptn-login-warning-alert | div | Warning alert message |
| ptn-login-forgot-link | a | Forgot password link |
| ptn-login-submit-button | button | Login submit button |
| ptn-login-signup-link | a | Link to signup page |
| ptn-demo-creds-tester | button | Demo credential — tester user |
| ptn-demo-creds-admin | button | Demo credential — admin user |
| ptn-demo-creds-locked | button | Demo credential — locked user |
| ptn-demo-creds-glitch | button | Demo credential — glitch user |
| ptn-signup-page | div | Signup page container |
| ptn-signup-name-input | input | Full name input field |
| ptn-signup-name-error | p | Name validation error message |
| ptn-signup-email-input | input | Email input field |
| ptn-signup-email-error | p | Email validation error message |
| ptn-signup-password-input | input | Password field with strength meter |
| ptn-signup-password-error | p | Password validation error |
| ptn-signup-confirm-password-error | p | Confirm password validation error |
| ptn-signup-alert | div | Alert container |
| ptn-signup-submit-button | button | Signup submit button |
| ptn-signup-attempts-left | p | Remaining OTP attempts counter |
| ptn-signup-otp-locked | p | OTP locked message |
| ptn-signup-verify-button | button | OTP verification button |
| ptn-signup-resend-button | button | Resend OTP button |
| ptn-signup-back-button | button | Back navigation button |
| ptn-forgot-page | div | Forgot password page container |
| ptn-forgot-message | div | Instruction message |
| ptn-forgot-email-input | input | Email input field |
| ptn-forgot-email-error | p | Email validation error |
| ptn-forgot-submit-button | button | Submit button |
| ptn-forgot-verify-button | button | OTP verification button |
| ptn-forgot-resend-button | button | Resend OTP button |
| ptn-forgot-back-button | button | Back navigation button |
| ptn-reset-page | div | Password reset page container |
| ptn-reset-alert | div | Alert container |
| ptn-reset-password-error | p | Password field error |
| ptn-reset-confirm-password-error | p | Confirm password field error |
| ptn-reset-submit-button | button | Reset password submit button |
40 test IDs
E-Commerce
/app/products, /app/cart, /app/checkout, /app/orders| Test ID | Element | Purpose |
|---|---|---|
| ptn-product-card | div | Product card container (multiple) |
| ptn-product-name | span | Product name display |
| ptn-product-price | span | Product price display |
| ptn-product-add-button | button | Add to cart button |
| category-card-{id} | div | Category card (dynamic) |
| deal-card-{id} | div | Deal/promo card (dynamic) |
| ptn-cart-page | div | Cart page container |
| ptn-cart-empty-continue-shopping | button | Continue shopping (empty cart) |
| ptn-cart-item | div | Cart line-item container (multiple) |
| ptn-cart-item-name | h3 | Product name in cart |
| ptn-cart-item-quantity | input | Quantity input field |
| ptn-cart-item-decrease | button | Decrease quantity button |
| ptn-cart-item-increase | button | Increase quantity button |
| ptn-cart-item-total | p | Line-item total price |
| ptn-cart-item-remove | button | Remove from cart button |
| ptn-cart-continue-shopping | button | Continue shopping button |
| ptn-cart-subtotal | span | Subtotal amount |
| ptn-cart-total | span | Total amount |
| ptn-cart-checkout-button | button | Proceed to checkout button |
| ptn-orders-page | div | Orders page container |
| ptn-orders-list | div | Orders list container |
| ptn-order-status-badge | div | Order status badge |
22 test IDs
Notes & Knowledge Sharing
/notes, /notes/[id], /notes/create, /notes/my-notes| Test ID | Element | Purpose |
|---|---|---|
| ptn-notes-feed | div | Main social notes feed container |
| ptn-notes-list-view | section | List view section |
| ptn-notes-grid-view | section | Grid view section |
| ptn-notes-loading | div | Loading indicator |
| ptn-notes-load-more | button | Load more button |
| ptn-notes-end-message | div | End of list message |
| ptn-notes-result-count | p | Result count display |
| ptn-notes-search-input | input | Keyword search field |
| ptn-notes-sort-select | select | Sort dropdown |
| ptn-notes-filter-panel | div | Filter panel container |
| ptn-notes-type-{type} | button | Type filter chip (dynamic) |
| ptn-notes-clear-type | button | Clear type filter button |
| ptn-notes-tag-{tag} | button | Tag filter chip (dynamic) |
| ptn-notes-clear-tags | button | Clear tags filter button |
| ptn-notes-view-mode-{id} | button | View mode toggle (dynamic) |
| ptn-notes-feed-toggle-{id} | button | Feed lens toggle (dynamic) |
| ptn-notes-tab-{id} | button | Feed tab (dynamic) |
| ptn-note-card-{id} | div | Individual note card (dynamic) |
| ptn-note-card-title | h3 | Note title |
| ptn-note-card-preview | p | Note preview text |
| ptn-note-card-content | div | Note content display |
| ptn-note-card-author | span | Author name |
| ptn-note-card-author-avatar | img | Author avatar image |
| ptn-note-card-timestamp | span | Creation timestamp |
| ptn-note-card-type | span | Note type badge |
| ptn-note-card-tags | div | Tags container |
| ptn-note-card-tag-{tag} | div | Individual tag (dynamic) |
| ptn-note-card-like-button | button | Like / unlike button |
| ptn-note-card-comment-button | button | Open comments button |
| ptn-note-card-comments | div | Comments count display |
| ptn-note-card-share-button | button | Share button |
| ptn-note-card-share | div | Share action container |
| ptn-note-card-bookmark | button | Bookmark button |
| ptn-note-card-bookmark-button | button | Bookmark action button |
| ptn-note-card-read-more | button | Read more / expand button |
| ptn-note-card-view-button | button | View note button |
| ptn-note-card-edit | button | Edit note button |
| ptn-note-card-delete | button | Delete note button |
| ptn-note-card-menu | button | Note card menu button |
| ptn-note-card-menu-dropdown | div | Note card menu dropdown |
| ptn-note-card-copy-link | button | Copy link option |
| ptn-notes-composer | div | Composer (collapsed) |
| ptn-notes-composer-expanded | div | Composer (expanded) |
| ptn-notes-composer-title | input | Composer title input |
| ptn-notes-composer-content | textarea | Composer content textarea |
| ptn-notes-composer-type-{type} | button | Type selector (dynamic) |
| ptn-notes-composer-tag-{tag} | div | Pre-populated tag (dynamic) |
| ptn-notes-composer-tag-input | input | Custom tag input |
| ptn-notes-composer-cancel | button | Cancel composer |
| ptn-notes-composer-submit | button | Submit note |
| ptn-my-notes-page | div | My notes page container |
| ptn-my-notes-create-button | button | Create new note button |
| ptn-my-notes-empty-state | div | Empty state card |
| ptn-my-notes-list | div | My notes list container |
| ptn-my-note-card | div | Individual note card in my notes |
| ptn-note-create-page | div | Create note page container |
| ptn-note-create-title-input | input | Title input |
| ptn-note-create-type-select | select | Type selector |
| ptn-note-create-content-input | textarea | Content textarea |
| ptn-note-create-tags-input | input | Tags input |
| ptn-note-create-submit-button | button | Submit new note |
| ptn-note-detail-page | div | Note detail page container |
| ptn-note-detail-title | h1 | Note title |
| ptn-note-detail-content | div | Note content |
| ptn-note-detail-edit-button | button | Edit note button |
| ptn-note-detail-delete-button | button | Delete note button |
| ptn-note-edit-page | div | Edit note page container |
| ptn-note-edit-title-input | input | Title input (edit) |
| ptn-note-edit-type-select | select | Type selector (edit) |
| ptn-note-edit-content-input | textarea | Content textarea (edit) |
| ptn-note-edit-tags-input | input | Tags input (edit) |
| ptn-note-edit-submit-button | button | Submit edited note |
| ptn-note-comment-input | textarea | Comment input field |
| ptn-note-comment-submit-button | button | Submit comment button |
| ptn-note-comments-list | div | Comments list container |
| ptn-note-comment | div | Individual comment |
| ptn-notes-sidebar-left | div | Left sidebar container |
| ptn-notes-shortcut-{label} | button | Sidebar shortcut (dynamic) |
| ptn-notes-logout-button | button | Logout button in sidebar |
| ptn-notes-sidebar-right | div | Right sidebar container |
| ptn-notes-trending-tag-{tag} | div | Trending tag item (dynamic) |
| ptn-notes-follow-suggestion-{name} | div | Follow suggestion (dynamic) |
| ptn-notes-practice-prompt-{index} | div | Practice prompt (dynamic) |
| ptn-notes-mobile-menu-button | button | Mobile menu toggle |
| ptn-notes-mobile-menu-nav-tab | button | Mobile nav tab |
| ptn-notes-mobile-menu-discovery-tab | button | Mobile discovery tab |
86 test IDs
FakeBank
/fakebank/*| Test ID | Element | Purpose |
|---|---|---|
| ptn-fakebank-login-form | form | Login form |
| ptn-fakebank-username-input | input | Username input |
| ptn-fakebank-password-input | input | Password input |
| ptn-fakebank-login-error | div | Login error message |
| ptn-fakebank-login-button | button | Login submit button |
| ptn-fakebank-credentials-table | div | Demo credentials table |
| ptn-fakebank-customer-dashboard | div | Customer dashboard page |
| ptn-fakebank-logout-button | button | Logout button |
| ptn-fakebank-account-card | div | Account card component |
| ptn-fakebank-account-number | p | Account number display |
| ptn-fakebank-account-balance | div | Account balance display |
| ptn-fakebank-transfer-page | div | Transfer page container |
| ptn-fakebank-transfer-form | form | Transfer form |
| ptn-fakebank-transfer-from-select | select | Source account selector |
| ptn-fakebank-transfer-to-select | select | Destination account selector |
| ptn-fakebank-transfer-amount-input | input | Transfer amount input |
| ptn-fakebank-transfer-description-input | input | Transfer description input |
| ptn-fakebank-transfer-submit-button | button | Transfer submit button |
| ptn-fakebank-transfer-error | div | Transfer error message |
| ptn-fakebank-transfer-success | div | Transfer success message |
| ptn-fakebank-transactions-page | div | Transactions page container |
| ptn-fakebank-account-select | select | Account filter selector |
| ptn-fakebank-transaction-table | div | Transactions table container |
| ptn-fakebank-no-transactions | div | No transactions message |
| ptn-fakebank-transaction-row | tr | Individual transaction row (multiple) |
| ptn-fakebank-service-requests-page | div | Service requests page |
| ptn-fakebank-new-request-button | button | New service request button |
| ptn-fakebank-service-request-form | form | Service request form |
| ptn-fakebank-service-request-type-select | select | Request type selector |
| ptn-fakebank-service-request-description-input | textarea | Description input |
| ptn-fakebank-service-request-priority-select | select | Priority selector |
| ptn-fakebank-service-request-error | div | Form error message |
| ptn-fakebank-service-request-success | div | Form success message |
| ptn-fakebank-service-request-submit-button | button | Submit request button |
| ptn-fakebank-service-requests-error | div | Page-level error |
| ptn-fakebank-service-requests-list | div | Requests list container |
| ptn-fakebank-service-request-item | div | Individual request card (multiple) |
| ptn-fakebank-bp-dashboard | div | Banking Professional dashboard |
| ptn-fakebank-bp-logout-button | button | BP logout button |
| ptn-fakebank-bp-error | div | BP-level error message |
| ptn-fakebank-customer-list | div | Customer list container |
| ptn-fakebank-no-customers | div | No customers message |
| ptn-fakebank-customer-row | tr | Individual customer row (multiple) |
| ptn-fakebank-approval-queue | div | Approval queue container |
| ptn-fakebank-no-pending-approvals | div | No pending approvals message |
| ptn-fakebank-approval-item | div | Approval item container |
| ptn-fakebank-approve-button | button | Approve button |
| ptn-fakebank-reject-button | button | Reject button |
| ptn-fakebank-reject-form | div | Rejection reason form |
| ptn-fakebank-reject-reason-input | textarea | Rejection reason input |
| ptn-fakebank-confirm-reject-button | button | Confirm rejection button |
| ptn-fakebank-bp-service-requests | div | BP service requests list |
| ptn-fakebank-bp-service-request-item | div | BP request item (multiple) |
53 test IDs
FlightLab
/flightlab/*| Test ID | Element | Purpose |
|---|---|---|
| ptn-flightlab-landing | div | Landing page container |
| ptn-flightlab-title | h1 | FlightLab title |
| ptn-flightlab-disclaimer | div | Flight booking disclaimer |
| ptn-flightlab-login-card | div | Login card container |
| ptn-flightlab-login-form | form | Login form |
| ptn-flightlab-login-error | div | Login error alert |
| ptn-flightlab-username-select | select | Username selector |
| ptn-flightlab-password-input | input | Password input |
| ptn-flightlab-login-button | button | Login button |
| ptn-flightlab-users-card | div | Demo users card |
| ptn-flightlab-user-{username} | div | User item (dynamic) |
| ptn-flightlab-quick-login-{username} | button | Quick login button (dynamic) |
| ptn-flightlab-back-home | button | Back to home button |
| ptn-flightlab-header | header | FlightLab header |
| ptn-flightlab-nav-dashboard | a | Nav — dashboard link |
| ptn-flightlab-nav-search | a | Nav — search link |
| ptn-flightlab-nav-bookings | a | Nav — bookings link |
| ptn-flightlab-nav-admin | a | Nav — admin link |
| ptn-flightlab-notifications-icon | button | Notifications icon button |
| ptn-flightlab-reset-sandbox-button | button | Reset sandbox button |
| ptn-flightlab-logout-button | button | Logout button |
| ptn-flightlab-dashboard | div | Dashboard page |
| ptn-flightlab-quick-search | div | Quick search widget |
| ptn-flightlab-quick-bookings | div | Quick bookings widget |
| ptn-flightlab-quick-notifications | div | Quick notifications widget |
| ptn-flightlab-quick-admin | div | Quick admin link |
| ptn-flightlab-search-page | div | Flight search page |
| ptn-flightlab-filter-airline | select | Airline filter |
| ptn-flightlab-filter-stops | select | Stops filter |
| ptn-flightlab-sort-by | select | Sort by selector |
| ptn-flightlab-search-results | div | Search results container |
| ptn-flightlab-booking-card | div | Booking card in list (multiple) |
| ptn-flightlab-bookings-list | div | Bookings list page |
| ptn-flightlab-bookings-filter | select | Bookings filter |
| ptn-flightlab-booking-detail | div | Booking detail page |
| ptn-flightlab-booking-confirm-button | button | Confirm booking button |
| ptn-flightlab-select-seats-button | button | Select seats button |
| ptn-flightlab-booking-cancel-button | button | Cancel booking button |
| ptn-flightlab-seat-selection-page | div | Seat selection page |
| ptn-flightlab-seat-map | div | Seat map container |
| ptn-flightlab-seat-{seatNumber} | button | Individual seat (dynamic) |
| ptn-flightlab-skip-seats | button | Skip seat selection |
| ptn-flightlab-save-seats | button | Save seat selection |
| ptn-flightlab-passenger-page | div | Passenger details page |
| ptn-flightlab-passenger-form | div | Passenger form container |
| ptn-flightlab-passenger-{index}-title | select | Passenger title (dynamic) |
| ptn-flightlab-passenger-{index}-gender | select | Passenger gender (dynamic) |
| ptn-flightlab-passenger-{index}-firstname | input | Passenger first name (dynamic) |
| ptn-flightlab-passenger-{index}-lastname | input | Passenger last name (dynamic) |
| ptn-flightlab-passenger-{index}-dob | input | Passenger date of birth (dynamic) |
| ptn-flightlab-passenger-{index}-ffn | input | Frequent flyer number (dynamic) |
| ptn-flightlab-passengers-back | button | Back button |
| ptn-flightlab-passengers-continue | button | Continue button |
| ptn-flightlab-review-page | div | Booking review page |
| ptn-flightlab-review-back | button | Back button on review |
| ptn-flightlab-review-confirm | button | Confirm booking button |
| ptn-flightlab-booking-confirmation | div | Booking confirmation page |
| ptn-flightlab-notifications-list | div | Notifications list page |
| ptn-flightlab-notifications-mark-read | button | Mark as read button |
| ptn-flightlab-admin-page | div | Admin page |
| ptn-flightlab-audit-filter | select | Audit log filter |
| ptn-flightlab-audit-log-table | div | Audit log table |
62 test IDs
HealthHub
/healthhub/*| Test ID | Element | Purpose |
|---|---|---|
| ptn-healthhub-login-form | form | Login form |
| ptn-healthhub-login-error | div | Login error alert |
| ptn-healthhub-login-username | input | Username input |
| ptn-healthhub-login-password | input | Password input |
| ptn-healthhub-login-submit | button | Login submit button |
| ptn-healthhub-role-{role} | div | Role selection card (dynamic) |
| ptn-healthhub-quick-login-{username} | button | Quick login button (dynamic) |
| ptn-healthhub-logout | button | Logout button |
| ptn-healthhub-book-appointment | button | Book appointment button |
| ptn-healthhub-booking-date | input | Appointment date input |
| ptn-healthhub-booking-time | select | Appointment time selector |
| ptn-healthhub-booking-type | select | Appointment type selector |
| ptn-healthhub-booking-reason | textarea | Appointment reason input |
| ptn-healthhub-booking-submit | button | Book appointment submit |
| ptn-healthhub-appointment-card-{id} | div | Appointment card (dynamic) |
| ptn-healthhub-appointment-cancel-{id} | button | Cancel appointment (dynamic) |
| ptn-healthhub-filter-upcoming | button | Upcoming appointments filter |
| ptn-healthhub-filter-past | button | Past appointments filter |
| ptn-healthhub-filter-all | button | All appointments filter |
| ptn-healthhub-filter-active | button | Active prescriptions filter |
| ptn-healthhub-filter-completed | button | Completed lab results filter |
| ptn-healthhub-filter-processing | button | Processing lab results filter |
| ptn-healthhub-prescription-card-{id} | div | Prescription card (dynamic) |
| ptn-healthhub-prescription-refill-{id} | button | Refill prescription (dynamic) |
| ptn-healthhub-lab-result-card-{id} | div | Lab result card (dynamic) |
| ptn-healthhub-new-message | button | New message button |
| ptn-healthhub-message-subject | input | Message subject input |
| ptn-healthhub-message-text | textarea | Message text input |
| ptn-healthhub-message-urgent | input | Urgent message checkbox |
| ptn-healthhub-message-send | button | Send message button |
| ptn-healthhub-thread-{threadId} | div | Message thread card (dynamic) |
| ptn-healthhub-patient-card-{mrn} | div | Patient card (dynamic) |
32 test IDs
API Explorer
/app/api-explorer| Test ID | Element | Purpose |
|---|---|---|
| ptn-api-explorer-page | div | API Explorer main page |
| ptn-api-explorer-send-button | button | Send API request button |
| ptn-api-explorer-response-status | span | Response status badge |
| api-request-builder | div | Request builder container |
| api-request-method | select | HTTP method selector |
| api-request-url | input | Request URL input |
| api-query-add | button | Add query parameter |
| api-query-toggle-{id} | input | Query parameter toggle (dynamic) |
| api-query-key-{id} | input | Query parameter key (dynamic) |
| api-query-value-{id} | input | Query parameter value (dynamic) |
| api-request-headers | div | Headers section |
| api-request-body | textarea | Request body textarea |
| api-attach-auth-checkbox | input | Attach auth token checkbox |
| api-response-viewer | section | Response viewer container |
| api-response-empty | div | Empty response message |
| api-response-clear | button | Clear response button |
| api-response-tab-{tab} | button | Response tab (dynamic) |
| api-response-pretty | pre | Pretty-printed JSON response |
| api-response-raw | pre | Raw response display |
| api-response-headers | div | Response headers display |
| api-endpoint-sidebar | div | Endpoint sidebar |
| api-endpoint-search | input | Endpoint search input |
| api-endpoint-{service}-{endpoint} | button | Endpoint item (dynamic) |
| api-base-url | span | API base URL badge |
| api-automation-hints | div | Automation hints card |
| api-onboarding-callout | div | Onboarding callout card |
| api-code-samples | div | Code samples container |
| api-code-tabs | div | Code sample tabs |
| api-code-tab-{id} | button | Code sample tab (dynamic) |
| api-code-tab-restassured | button | RestAssured code tab |
| api-code-tab-curl | button | cURL code tab |
| api-code-copy | button | Copy code button |
| api-code-copy-btn | button | Copy button (alternate) |
| api-code-snippet | pre | Code snippet display |
| api-code-content | pre | Code content display |
| api-method-badge-{method} | span | HTTP method badge (dynamic) |
36 test IDs
Practice Challenges
/practice-challenges/*| Test ID | Element | Purpose |
|---|---|---|
| position-zone | div | Pixel-perfect position zone |
| shifting-button | button | Position-shifting button |
| color-zone | div | Color challenge zone |
| variable-text | div | Variable text element |
| icon-zone | div | Icon challenge zone |
| variable-icon | span | Variable icon element |
| layout-zone | div | Layout challenge zone |
| variable-card | div | Variable card element |
| complex-zone | div | Complex challenge zone |
| avatar | img | Avatar image |
| complex-title | h3 | Complex title text |
| complex-button | button | Complex button |
| timestamp-zone | div | Timestamp challenge zone |
| dynamic-timestamp | span | Dynamic timestamp |
| session-id | div | Session ID display |
| last-updated | div | Last updated timestamp |
| antialiasing-zone | div | Antialiasing challenge zone |
| subtle-shadow-box | div | Subtle shadow box |
| fine-border-box | div | Fine border box |
| gradient-box | div | Gradient box |
| canvas-zone | div | Canvas challenge zone |
| dynamic-canvas | canvas | Dynamic canvas element |
| email-input | input | Mock inbox email input |
| purpose-select | select | Purpose selector |
| delay-checkbox | input | Delay checkbox |
| spam-checkbox | input | Spam checkbox |
| send-otp-button | button | Send OTP button |
| retrieve-otp-button | button | Retrieve OTP button |
| otp-code | div | OTP code display |
| otp-verify-input | input | OTP verification input |
| verify-otp-button | button | Verify OTP button |
| verification-result | div | Verification result message |
| error-message | div | Error message display |
| retry-counter | div | Retry counter (flaky network) |
| test-no-retry | button | Test no-retry button |
| test-with-retry | button | Test with-retry button |
| test-custom | button | Test custom button |
| test-submit | button | Submit test button |
| loading-state | div | Loading state indicator |
| success-result | div | Success result display |
| error-result | div | Error result display |
| circuit-status | div | Circuit breaker status |
42 test IDs
Chaos Mode
/app/chaos| Test ID | Element | Purpose |
|---|---|---|
| delayed-button | button | Button with delayed visibility |
| shadow-host | div | Shadow DOM host element |
| shadow-input | input | Input inside shadow DOM |
| stale-element-button | button | Stale element reference button |
| visible-submit | button | Visibility-changing submit button |
| moving-target | button | Moving target button |
| test-scenario-{id} | button | Test scenario button (dynamic) |
| chaos-level-{level} | button | Chaos level selector (dynamic) |
8 test IDs
Admin Dashboard
/admin| Test ID | Element | Purpose |
|---|---|---|
| admin-dashboard | div | Admin dashboard page |
| dashboard-orders-snapshot | div | Orders snapshot widget |
| order-snapshot-item | div | Order snapshot item (multiple) |
| dashboard-notes-snapshot | div | Notes snapshot widget |
| note-snapshot-item | div | Note snapshot item (multiple) |
| health-refresh-btn | button | Health check refresh button |
| health-status | div | Health status display |
| shortcut-login-{userId} | button | Quick login shortcut (dynamic) |
| shortcut-test-scenarios | button | Test scenarios shortcut |
| activity-filter-{type} | button | Activity filter button (dynamic) |
| activity-filter-search | input | Activity search input |
| activity-item | div | Individual activity item (multiple) |
| activity-load-more | button | Load more activities button |
| quick-action-{id} | button | Quick action button (dynamic) |
| feature-flag-{id} | button | Feature flag toggle (dynamic) |
15 test IDs
Usage Tips
- Selector Strategy: Use
data-testidas your primary selector.// Cypresscy.get('[data-testid="ptn-login-submit-button"]')// Playwrightpage.locator('[data-testid="ptn-login-submit-button"]')// Selenium (Java)driver.findElement(By.cssSelector("[data-testid='ptn-login-submit-button']")) - Stability Promise: Test IDs in this schema remain stable across minor updates. Breaking changes are documented with version bumps.
- Multiple Instances: Elements like
ptn-product-card,ptn-cart-itemappear multiple times. UsegetAllByTestId()or index-based selection. - Dynamic IDs: Entries with
{id}are parameterized. The actual value is injected at runtime (e.g.ptn-note-card-abc123). Use partial selectors:[data-testid^="ptn-note-card-"]. - Chaos Mode Resilience: In Chaos Mode, test IDs remain stable even when other attributes randomize — perfect for practicing resilient selector strategies.
- Missing IDs? If you find an element without a test ID that should have one, please report it.
- API Testing: For REST API automation, see the API Documentation and download the Postman Collection.