# Complete Missing Locators List - For UI Dev Team ## 📋 Overview This document lists **ALL** missing `data-testid` attributes and temporary locators that need to be replaced with proper `data-testid` attributes. **Purpose**: Once UI Dev Team adds all these attributes, the automation will be 100% aligned and ready for testing. **Last Updated**: Based on DOM validation and code analysis --- ## 🔴 CRITICAL: Current Status **DOM Validation Result**: Found **0 elements** with `data-testid` attributes in the live DOM. This means **ALL** `data-testid` attributes are currently missing from the rendered DOM, even though they may be in the source code. --- ## 📄 PAGE-BY-PAGE BREAKDOWN ### 1. LOGIN PAGE (`pages/login_page.py`) #### ✅ Currently Using data-testid (Expected): - `student_login__form` - `student_login__identifier_input` - `student_login__password_input` - `student_login__remember_checkbox` - `student_login__error_banner` - `student_login__submit_button` #### ❌ TEMPORARY LOCATORS (Need data-testid): | Current Locator | Type | Location | Required data-testid | Notes | | -------------------------------------------------------------------------------------- | ----- | -------------------- | ------------------------------ | ------------------------ | | `//div[@role='status' and @aria-live='polite' and (contains(text(), 'Invalid')...)]` | XPath | `login_page.py:26` | `student_login__error_toast` | Error toast notification | --- ### 2. DASHBOARD PAGE (`pages/dashboard_page.py`) #### ✅ Currently Using data-testid (Expected): - `student_nav__assessments_link` - `profile_incomplete__modal` - `profile_incomplete__complete_button` - `profile_incomplete__progress_value` #### ❌ TEMPORARY LOCATORS (Need data-testid): | Current Locator | Type | Location | Required data-testid | Notes | | --------------------------------------- | ----- | ------------------------ | ------------------------------ | ----------------------- | | `//h1[contains(text(), 'Hi There!')]` | XPath | `dashboard_page.py:19` | `dashboard__welcome_message` | Welcome message heading | --- ### 3. STUDENT NAVIGATION (`pages/student_nav_page.py`) #### ✅ Currently Using data-testid (Expected): - `student_nav__dashboard_link` - `student_nav__assessments_link` - `student_nav__profile_button` - `student_nav__profile_dropdown` - `student_nav__edit_profile_button` - `student_nav__reset_password_button` - `student_nav__sign_out_button` **Status**: ✅ All locators use data-testid - No temporary locators --- ### 4. MANDATORY PASSWORD RESET (`pages/mandatory_reset_page.py`) #### ✅ Currently Using data-testid (Expected): - `mandatory_reset__modal` - `mandatory_reset__continue_button` - `mandatory_reset__form` - `mandatory_reset__current_password_input` - `mandatory_reset__new_password_input` - `mandatory_reset__confirm_password_input` - `mandatory_reset__current_password_error` - `mandatory_reset__new_password_error` - `mandatory_reset__confirm_password_error` - `mandatory_reset__back_button` - `mandatory_reset__submit_button` **Status**: ✅ All locators use data-testid - No temporary locators --- ### 5. PROFILE INCOMPLETE MODAL (`pages/profile_incomplete_page.py`) #### ✅ Currently Using data-testid (Expected): - `profile_incomplete__modal` - `profile_incomplete__progress_value` - `profile_incomplete__complete_button` **Status**: ✅ All locators use data-testid - No temporary locators --- ### 6. PROFILE EDITOR PAGE (`pages/profile_editor_page.py`) #### ❌ MISSING data-testid ATTRIBUTES (ALL 50+ base attributes): **Page-Level Elements:** | Required data-testid | Element | Current Status | File Location | | ----------------------------------------- | ------------------- | -------------- | --------------------------------- | | `profile_editor__page` | Main container div | ❌ Missing | `StudentProfileEditor.jsx:1629` | | `profile_editor__progress_value` | Progress percentage | ❌ Missing | `StudentProfileEditor.jsx:1692` | | `profile_editor__missing_fields_toggle` | Toggle button | ❌ Missing | `StudentProfileEditor.jsx:1701` | **Navigation Buttons:** | Required data-testid | Element | 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` | **Tab Navigation:** | Required data-testid | Element | 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) | **Step 1: Personal Information:** | Required data-testid | Element | 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` | **Step 2: Contact Information:** | Required data-testid | Element | 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` | **Step 3: Parent/Guardian:** | Required data-testid | Element | 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` | **Step 4: Education Details:** | Required data-testid | Element | 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` | **Step 5: Focus Areas (Multi-Select Checkboxes):** | Required data-testid Pattern | Element | Current Status | File Location | | ------------------------------------------------------------ | -------- | -------------- | ----------------------------------------------------- | | `profile_editor__short_term_focus__{formatTestId(option)}` | Checkbox | ❌ Missing | `StudentProfileEditor.jsx:1301` (MultiSelectPicker) | | `profile_editor__long_term_focus__{formatTestId(option)}` | Checkbox | ❌ Missing | `StudentProfileEditor.jsx:1333` (MultiSelectPicker) | | `profile_editor__short_term_focus_others_text` | Input | ❌ Missing | `StudentProfileEditor.jsx:1312` | | `profile_editor__long_term_focus_others_text` | Input | ❌ Missing | `StudentProfileEditor.jsx:1344` | **Step 6: Self-Assessment (Multi-Select Checkboxes):** | Required data-testid Pattern | Element | Current Status | File Location | | ------------------------------------------------------- | -------- | -------------- | ----------------------------------------------------- | | `profile_editor__strength__{formatTestId(option)}` | Checkbox | ❌ Missing | `StudentProfileEditor.jsx:1375` (MultiSelectPicker) | | `profile_editor__improvement__{formatTestId(option)}` | Checkbox | ❌ Missing | `StudentProfileEditor.jsx:1407` (MultiSelectPicker) | | `profile_editor__strength_others_text` | Input | ❌ Missing | `StudentProfileEditor.jsx:1386` | | `profile_editor__improvement_others_text` | Input | ❌ Missing | `StudentProfileEditor.jsx:1418` | **Step 7: Hobbies & Clubs:** | Required data-testid Pattern | Element | Current Status | File Location | | ------------------------------------------------- | -------- | -------------- | ----------------------------------------------------- | | `profile_editor__hobby__{formatTestId(option)}` | Checkbox | ❌ Missing | `StudentProfileEditor.jsx:1449` (MultiSelectPicker) | | `profile_editor__club_{formatTestId(option)}` | Checkbox | ❌ Missing | `StudentProfileEditor.jsx:1495` (Direct mapping) | | `profile_editor__hobby_other_text` | Input | ❌ Missing | `StudentProfileEditor.jsx:1460` | | `profile_editor__club_other_text` | Input | ❌ Missing | `StudentProfileEditor.jsx:1518` | **Step 8: Achievements:** | Required data-testid | Element | 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` | **Step 9: Expectations:** | Required data-testid Pattern | Element | Current Status | File Location | | ------------------------------------------------------- | -------- | -------------- | ----------------------------------------------------- | | `profile_editor__expectation__{formatTestId(option)}` | Checkbox | ❌ Missing | `StudentProfileEditor.jsx:1605` (MultiSelectPicker) | | `profile_editor__expectation_others_text` | Input | ❌ Missing | `StudentProfileEditor.jsx:1616` | #### ❌ TEMPORARY LOCATORS (Need data-testid): | Current Locator | Type | Location | Required data-testid | Notes | | ------------------------------------------------------------------------------- | ----- | ------------------------------ | -------------------------------------------- | ------------------------------- | | `//button[contains(@class, 'absolute right-0') and contains(@class, 'z-20')]` | XPath | `profile_editor_page.py:328` | `profile_editor__tabs_scroll_right_button` | Right scroll button for tabs | | `//button[.//*[contains(@class, 'lucide-chevron-right')...]]` | XPath | `profile_editor_page.py:342` | `profile_editor__tabs_scroll_right_button` | Alternative right scroll button | | `//button[contains(@class, 'absolute left-0') and contains(@class, 'z-20')]` | XPath | `profile_editor_page.py:360` | `profile_editor__tabs_scroll_left_button` | Left scroll button for tabs | | `//div[@role='status']` | XPath | `profile_editor_page.py:520` | `profile_editor__toast_message` | Toast notification container | --- ### 7. ASSESSMENTS PAGE (`pages/assessments_page.py`) #### ✅ Currently Using data-testid (Expected): - Dynamic pattern: `assessment_card__{assignmentId}` - Dynamic pattern: `assessment_card__{assignmentId}_action` **Status**: ✅ All locators use data-testid - No temporary locators --- ## 📊 SUMMARY STATISTICS ### Total Missing data-testid Attributes: **~60+ base attributes + dynamic checkboxes** **Breakdown:** - **Login Page**: 1 temporary locator - **Dashboard Page**: 1 temporary locator - **Profile Editor Page**: - **50+ base attributes** (all inputs, selects, textareas, buttons, tabs) - **100+ dynamic checkboxes** (Focus Areas, Strengths, Improvements, Hobbies, Clubs, Expectations) - **4 temporary XPath locators** (scroll buttons, toast messages) ### Total Temporary Locators: **6 XPath locators** --- ## 🎯 PRIORITY ORDER FOR UI DEV TEAM ### Priority 1: CRITICAL (Required for Basic Automation) 1. **Profile Editor - Navigation Buttons** (4 attributes) - `profile_editor__prev_button` - `profile_editor__next_button` - `profile_editor__cancel_button` - `profile_editor__save_button` 2. **Profile Editor - Tab Navigation** (9 attributes) - All 9 tab buttons with pattern: `profile_editor__tab_{formatTestId(section.title)}` 3. **Profile Editor - Step 1-4 Basic Fields** (30+ attributes) - All input fields, selects, checkboxes in Steps 1-4 ### Priority 2: IMPORTANT (Required for Complete Automation) 1. **Profile Editor - Multi-Select Checkboxes** (100+ dynamic attributes) - Update `MultiSelectPicker` component to generate `data-testid` using `testIdPrefix` and `formatTestId` - This will automatically fix Focus Areas, Strengths, Improvements, Hobbies, Expectations 2. **Profile Editor - Clubs Checkboxes** (12+ attributes) - Add `data-testid` to each club checkbox in the mapping 3. **Profile Editor - Textareas** (5 attributes) - All achievement textareas ### Priority 3: NICE TO HAVE (Optional) 1. **Temporary Locators Replacement** - Tab scroll buttons - Toast message containers - Welcome message --- ## 📝 IMPLEMENTATION NOTES FOR UI DEV TEAM ### 1. MultiSelectPicker Component Update **File**: `src/pages/StudentProfileEditor.jsx` (Line 147) **Current Code**: ```jsx ``` **Status**: ✅ Already implemented in code, but not rendering in DOM **Action**: Verify `testIdPrefix` prop is being passed correctly to all `MultiSelectPicker` instances ### 2. Tab Navigation **File**: `src/pages/StudentProfileEditor.jsx` (Line 1821) **Current Code**: ```jsx const tabTestId = `profile_editor__tab_${formatTestId(section.title)}`