# UI Dev Team - Complete data-testid Requirements ## 🎯 Purpose This document provides a **complete, detailed list** of ALL missing `data-testid` attributes and temporary locators that need to be implemented in the UI code. **Goal**: Once all attributes are added, the automation framework will be 100% aligned and ready for testing. --- ## 📊 Current Status **DOM Validation Result**: **0 elements** with `data-testid` attributes found in live DOM. This means **ALL** `data-testid` attributes need to be added to the rendered DOM. --- ## 📋 COMPLETE LIST OF MISSING ATTRIBUTES ### 1. LOGIN PAGE (`/` or `/login`) **Scope**: `student_login` | Required data-testid | Element Type | Current Status | File Location | |---------------------|--------------|----------------|---------------| | `student_login__form` | Form | ❌ Missing | Login component | | `student_login__identifier_input` | Input | ❌ Missing | Login component | | `student_login__password_input` | Input | ❌ Missing | Login component | | `student_login__remember_checkbox` | Checkbox | ❌ Missing | Login component | | `student_login__error_banner` | Error div | ❌ Missing | Login component | | `student_login__submit_button` | Button | ❌ Missing | Login component | | `student_login__error_toast` | Toast div | ❌ Missing | Login component (currently using XPath) | **Total**: 7 attributes --- ### 2. DASHBOARD PAGE (`/student/dashboard`) **Scope**: `dashboard` (optional), `profile_incomplete` | Required data-testid | Element Type | Current Status | File Location | |---------------------|--------------|----------------|---------------| | `dashboard__welcome_message` | Heading | ❌ Missing | Dashboard component (currently using XPath) | | `profile_incomplete__modal` | Modal | ❌ Missing | Profile incomplete modal | | `profile_incomplete__progress_value` | Span | ❌ Missing | Profile incomplete modal | | `profile_incomplete__complete_button` | Button | ❌ Missing | Profile incomplete modal | **Total**: 4 attributes --- ### 3. STUDENT NAVIGATION (Header - All Pages) **Scope**: `student_nav` | Required data-testid | Element Type | Current Status | File Location | |---------------------|--------------|----------------|---------------| | `student_nav__dashboard_link` | Link | ❌ Missing | Navigation component | | `student_nav__assessments_link` | Link | ❌ Missing | Navigation component | | `student_nav__profile_button` | Button | ❌ Missing | Navigation component | | `student_nav__profile_dropdown` | Dropdown | ❌ Missing | Navigation component | | `student_nav__edit_profile_button` | Button | ❌ Missing | Navigation component | | `student_nav__reset_password_button` | Button | ❌ Missing | Navigation component | | `student_nav__sign_out_button` | Button | ❌ Missing | Navigation component | **Total**: 7 attributes --- ### 4. MANDATORY PASSWORD RESET MODAL **Scope**: `mandatory_reset` | Required data-testid | Element Type | Current Status | File Location | |---------------------|--------------|----------------|---------------| | `mandatory_reset__modal` | Modal | ❌ Missing | Password reset modal | | `mandatory_reset__continue_button` | Button | ❌ Missing | Password reset modal | | `mandatory_reset__form` | Form | ❌ Missing | Password reset modal | | `mandatory_reset__current_password_input` | Input | ❌ Missing | Password reset modal | | `mandatory_reset__new_password_input` | Input | ❌ Missing | Password reset modal | | `mandatory_reset__confirm_password_input` | Input | ❌ Missing | Password reset modal | | `mandatory_reset__current_password_error` | Error div | ❌ Missing | Password reset modal | | `mandatory_reset__new_password_error` | Error div | ❌ Missing | Password reset modal | | `mandatory_reset__confirm_password_error` | Error div | ❌ Missing | Password reset modal | | `mandatory_reset__back_button` | Button | ❌ Missing | Password reset modal | | `mandatory_reset__submit_button` | Button | ❌ Missing | Password reset modal | **Total**: 11 attributes --- ### 5. PROFILE EDITOR PAGE (`/student/profile-builder`) **Scope**: `profile_editor` #### 5.1 Page-Level Elements (3 attributes) | Required data-testid | Element Type | Current Status | File Location | |---------------------|--------------|----------------|---------------| | `profile_editor__page` | Main container div | ❌ Missing | `StudentProfileEditor.jsx:1629` | | `profile_editor__progress_value` | Progress span | ❌ Missing | `StudentProfileEditor.jsx:1692` | | `profile_editor__missing_fields_toggle` | Toggle button | ❌ Missing | `StudentProfileEditor.jsx:1701` | #### 5.2 Navigation Buttons (4 attributes) | Required data-testid | Element Type | Current Status | File Location | |---------------------|--------------|----------------|---------------| | `profile_editor__prev_button` | Previous button | ❌ Missing | `StudentProfileEditor.jsx:1897` | | `profile_editor__next_button` | Next button | ❌ Missing | `StudentProfileEditor.jsx:1907` | | `profile_editor__cancel_button` | Cancel button | ❌ Missing | `StudentProfileEditor.jsx:1919` | | `profile_editor__save_button` | Save button | ❌ Missing | `StudentProfileEditor.jsx:1927` | #### 5.3 Tab Navigation (9 attributes) | Required data-testid | Element Type | Current Status | File Location | |---------------------|--------------|----------------|---------------| | `profile_editor__tab_personal_information` | Tab button | ❌ Missing | `StudentProfileEditor.jsx:1831` (dynamic) | | `profile_editor__tab_contact_information` | Tab button | ❌ Missing | `StudentProfileEditor.jsx:1831` (dynamic) | | `profile_editor__tab_parent_guardian` | Tab button | ❌ Missing | `StudentProfileEditor.jsx:1831` (dynamic) | | `profile_editor__tab_education_details` | Tab button | ❌ Missing | `StudentProfileEditor.jsx:1831` (dynamic) | | `profile_editor__tab_focus_areas` | Tab button | ❌ Missing | `StudentProfileEditor.jsx:1831` (dynamic) | | `profile_editor__tab_self_assessment` | Tab button | ❌ Missing | `StudentProfileEditor.jsx:1831` (dynamic) | | `profile_editor__tab_hobbies_clubs` | Tab button | ❌ Missing | `StudentProfileEditor.jsx:1831` (dynamic) | | `profile_editor__tab_achievements` | Tab button | ❌ Missing | `StudentProfileEditor.jsx:1831` (dynamic) | | `profile_editor__tab_expectations` | Tab button | ❌ Missing | `StudentProfileEditor.jsx:1831` (dynamic) | **Note**: These are generated dynamically using `formatTestId(section.title)`. Verify the function works correctly. #### 5.4 Tab Scroll Buttons (2 attributes) | Required data-testid | Element Type | Current Status | File Location | |---------------------|--------------|----------------|---------------| | `profile_editor__tabs_scroll_right_button` | Scroll button | ❌ Missing | Tab scroll container (~1850) | | `profile_editor__tabs_scroll_left_button` | Scroll button | ❌ Missing | Tab scroll container (~1850) | **Currently using**: XPath locators (temporary) #### 5.5 Step 1: Personal Information (11 attributes) | Required data-testid | Element Type | Current Status | File Location | |---------------------|--------------|----------------|---------------| | `profile_editor__first_name_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:777` | | `profile_editor__last_name_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:795` | | `profile_editor__gender_select` | Select | ❌ Missing | `StudentProfileEditor.jsx:810` | | `profile_editor__dob_input` | Date input | ❌ Missing | `StudentProfileEditor.jsx:830` | | `profile_editor__roll_number_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:847` | | `profile_editor__nationality_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:863` | | `profile_editor__language_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:873` | | `profile_editor__student_id_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:883` | | `profile_editor__student_cpid_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:893` | | `profile_editor__specially_abled_checkbox` | Checkbox | ❌ Missing | `StudentProfileEditor.jsx:904` | | `profile_editor__specially_abled_details_textarea` | Textarea | ❌ Missing | `StudentProfileEditor.jsx:917` | #### 5.6 Step 2: Contact Information (7 attributes) | Required data-testid | Element Type | Current Status | File Location | |---------------------|--------------|----------------|---------------| | `profile_editor__email_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:937` | | `profile_editor__phone_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:955` | | `profile_editor__address_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:973` | | `profile_editor__city_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:984` | | `profile_editor__state_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:994` | | `profile_editor__zip_code_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:1004` | | `profile_editor__native_state_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:1014` | #### 5.7 Step 3: Parent/Guardian (14 attributes) | Required data-testid | Element Type | Current Status | File Location | |---------------------|--------------|----------------|---------------| | `profile_editor__father_full_name_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:1040` | | `profile_editor__father_age_range_select` | Select | ❌ Missing | `StudentProfileEditor.jsx:1048` | | `profile_editor__father_occupation_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:1064` | | `profile_editor__father_email_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:1074` | | `profile_editor__mother_full_name_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:1093` | | `profile_editor__mother_age_range_select` | Select | ❌ Missing | `StudentProfileEditor.jsx:1101` | | `profile_editor__mother_occupation_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:1117` | | `profile_editor__mother_email_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:1127` | | `profile_editor__guardian_different_checkbox` | Checkbox | ❌ Missing | `StudentProfileEditor.jsx:1142` | | `profile_editor__guardian_full_name_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:1157` | | `profile_editor__guardian_relationship_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:1167` | | `profile_editor__guardian_phone_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:1178` | | `profile_editor__guardian_email_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:1188` | | `profile_editor__guardian_address_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:1199` | #### 5.8 Step 4: Education Details (4 attributes) | Required data-testid | Element Type | Current Status | File Location | |---------------------|--------------|----------------|---------------| | `profile_editor__full_name_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:1236` | | `profile_editor__current_grade_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:1247` | | `profile_editor__section_input` | Input | ❌ Missing | `StudentProfileEditor.jsx:1257` | | `profile_editor__board_stream_select` | Select | ❌ Missing | `StudentProfileEditor.jsx:1265` | #### 5.9 Step 5: Focus Areas (22+ dynamic attributes) **Short-term Focus Areas** (11 options): - Pattern: `profile_editor__short_term_focus__{formatTestId(option)}` - Example: `profile_editor__short_term_focus__01_academics` - Location: `StudentProfileEditor.jsx:1301` (MultiSelectPicker with `testIdPrefix="profile_editor__short_term_focus"`) **Long-term Focus Areas** (11 options): - Pattern: `profile_editor__long_term_focus__{formatTestId(option)}` - Example: `profile_editor__long_term_focus__01_academics` - Location: `StudentProfileEditor.jsx:1333` (MultiSelectPicker with `testIdPrefix="profile_editor__long_term_focus"`) **"Others" Text Inputs**: - `profile_editor__short_term_focus_others_text` - Location: `StudentProfileEditor.jsx:1312` - `profile_editor__long_term_focus_others_text` - Location: `StudentProfileEditor.jsx:1344` **Status**: ❌ Missing - MultiSelectPicker component needs to generate these dynamically #### 5.10 Step 6: Self-Assessment (36+ dynamic attributes) **Strengths** (19 options): - Pattern: `profile_editor__strength__{formatTestId(option)}` - Example: `profile_editor__strength__1_quick_learning` - Location: `StudentProfileEditor.jsx:1375` (MultiSelectPicker with `testIdPrefix="profile_editor__strength"`) **Areas of Improvement** (19 options): - Pattern: `profile_editor__improvement__{formatTestId(option)}` - Example: `profile_editor__improvement__1_quick_learning` - Location: `StudentProfileEditor.jsx:1407` (MultiSelectPicker with `testIdPrefix="profile_editor__improvement"`) **"Others" Text Inputs**: - `profile_editor__strength_others_text` - Location: `StudentProfileEditor.jsx:1386` - `profile_editor__improvement_others_text` - Location: `StudentProfileEditor.jsx:1418` **Status**: ❌ Missing - MultiSelectPicker component needs to generate these dynamically #### 5.11 Step 7: Hobbies & Clubs (26+ dynamic attributes) **Hobbies/Interests** (12 options): - Pattern: `profile_editor__hobby__{formatTestId(option)}` - Example: `profile_editor__hobby__01_reading` - Location: `StudentProfileEditor.jsx:1449` (MultiSelectPicker with `testIdPrefix="profile_editor__hobby"`) **Clubs or Teams** (12 options): - Pattern: `profile_editor__club_{formatTestId(option)}` (NOTE: single underscore, not double) - Example: `profile_editor__club_1_science_club` - Location: `StudentProfileEditor.jsx:1495` (Direct mapping, not MultiSelectPicker) **"Others" Text Inputs**: - `profile_editor__hobby_other_text` - Location: `StudentProfileEditor.jsx:1460` - `profile_editor__club_other_text` - Location: `StudentProfileEditor.jsx:1518` **Status**: ❌ Missing - MultiSelectPicker and Clubs mapping need these #### 5.12 Step 8: Achievements (5 attributes) | Required data-testid | Element Type | Current Status | File Location | |---------------------|--------------|----------------|---------------| | `profile_editor__achievement_academics_textarea` | Textarea | ❌ Missing | `StudentProfileEditor.jsx:1541` | | `profile_editor__achievement_sports_textarea` | Textarea | ❌ Missing | `StudentProfileEditor.jsx:1551` | | `profile_editor__achievement_cultural_textarea` | Textarea | ❌ Missing | `StudentProfileEditor.jsx:1561` | | `profile_editor__achievement_trained_textarea` | Textarea | ❌ Missing | `StudentProfileEditor.jsx:1572` (conditional - adults only) | | `profile_editor__achievement_others_textarea` | Textarea | ❌ Missing | `StudentProfileEditor.jsx:1583` | #### 5.13 Step 9: Expectations (11+ dynamic attributes) **Expectations** (10 options): - Pattern: `profile_editor__expectation__{formatTestId(option)}` - Example: `profile_editor__expectation__1_self_understanding_gain_deeper_insights_into_their_personality_strengths_and_areas_for_growth` - Location: `StudentProfileEditor.jsx:1605` (MultiSelectPicker with `testIdPrefix="profile_editor__expectation"`) **"Others" Text Input**: - `profile_editor__expectation_others_text` - Location: `StudentProfileEditor.jsx:1616` **Status**: ❌ Missing - MultiSelectPicker component needs to generate these dynamically #### 5.14 Toast Messages (1-2 attributes) | Required data-testid | Element Type | Current Status | File Location | |---------------------|--------------|----------------|---------------| | `profile_editor__toast_message` | Toast div | ❌ Missing | Toast component (currently using XPath) | | OR separate: | | | | | `profile_editor__success_toast` | Success toast | ❌ Missing | Toast component | | `profile_editor__error_toast` | Error toast | ❌ Missing | Toast component | **Currently using**: XPath `//div[@role='status']` --- ### 6. ASSESSMENTS PAGE (`/assessments`) **Scope**: `assessment_card` **Dynamic Pattern** (Already implemented in code, verify in DOM): - `assessment_card__{assignmentId}` - Assessment card container - `assessment_card__{assignmentId}_action` - Begin/Continue/Resume button **Status**: ✅ Pattern defined, verify in DOM --- ## 📊 SUMMARY STATISTICS ### Total Missing Attributes: **~150+ base attributes + 100+ dynamic checkboxes** **Breakdown by Page:** - Login Page: **7 attributes** - Dashboard Page: **4 attributes** - Student Navigation: **7 attributes** - Password Reset Modal: **11 attributes** - Profile Editor Page: **~120+ base attributes + 100+ dynamic checkboxes** - Assessments Page: **Dynamic pattern** (verify in DOM) ### Total Temporary Locators: **6 XPath locators** 1. Login error toast (XPath) 2. Dashboard welcome message (XPath) 3. Profile editor tab scroll right button (XPath - 2 variants) 4. Profile editor tab scroll left button (XPath) 5. Profile editor toast message (XPath) --- ## 🎯 IMPLEMENTATION PRIORITY ### Priority 1: CRITICAL (Must Implement First) 1. **Profile Editor - Navigation Buttons** (4) - `profile_editor__prev_button` - `profile_editor__next_button` - `profile_editor__cancel_button` - `profile_editor__save_button` 2. **Profile Editor - Tab Navigation** (9) - All 9 tab buttons 3. **Profile Editor - Tab Scroll Buttons** (2) - `profile_editor__tabs_scroll_right_button` - `profile_editor__tabs_scroll_left_button` 4. **Profile Editor - Steps 1-4 Basic Fields** (36) - All input fields, selects, textareas in Steps 1-4 ### Priority 2: IMPORTANT (Required for Complete Automation) 1. **MultiSelectPicker Component Update** - Verify `testIdPrefix` prop is passed correctly - Verify `formatTestId` function generates correct IDs - This will automatically fix 100+ dynamic checkboxes 2. **Profile Editor - Steps 5-9** (84+ attributes) - All multi-select checkboxes - All textareas - All "Others" text inputs 3. **Toast Messages** (1-2) - Success/error toast containers ### Priority 3: NICE TO HAVE 1. Login error toast 2. Dashboard welcome message --- ## 📝 CODE EXAMPLES FOR UI DEV TEAM ### Example 1: Input Field ```jsx handleFieldChange('firstName', e.target.value)} data-testid="profile_editor__first_name_input" // ✅ ADD THIS className="..." /> ``` ### Example 2: Select Dropdown ```jsx