This commit is contained in:
2025-11-27 13:26:17 +01:00
parent 502d9084e7
commit 6a0cab6cc6
32 changed files with 13127 additions and 96 deletions

View File

@@ -28,9 +28,9 @@ export const IRACING_SELECTORS = {
// Common modal/wizard selectors - VERIFIED from real HTML
wizard: {
modal: '#create-race-modal, [role="dialog"], .modal.fade.in',
modal: '#create-race-modal, [role="dialog"], .modal, .modal.show, .modal.fade.in, [data-modal="true"]',
modalDialog: '#create-race-modal-modal-dialog, .modal-dialog',
modalContent: '#create-race-modal-modal-content, .modal-content',
modalContent: '#create-race-modal .modal-content, .modal-content, .modal-body',
modalTitle: '[data-testid="modal-title"], .modal-title',
// Wizard footer buttons - these are anchor tags styled as buttons
// The "Next" button shows the name of the next step (e.g., "Server Details")
@@ -72,35 +72,35 @@ export const IRACING_SELECTORS = {
// Form fields - based on actual iRacing DOM structure
fields: {
textInput: 'input.form-control, .chakra-input, input[type="text"]',
passwordInput: 'input[type="password"], input[maxlength="32"].form-control',
textarea: 'textarea.form-control, .chakra-textarea, textarea',
select: '.chakra-select, select.form-control, select',
checkbox: '.chakra-checkbox, input[type="checkbox"], .switch-checkbox',
slider: '.chakra-slider, input[type="range"]',
toggle: '.switch input.switch-checkbox, .toggle-switch input',
textInput: 'input.form-control, .chakra-input, input[type="text"], input[data-field], input[data-test], input[placeholder]',
passwordInput: 'input[type="password"], input[maxlength="32"].form-control, input[data-field="password"], input[name="password"]',
textarea: 'textarea.form-control, .chakra-textarea, textarea, textarea[data-field]',
select: '.chakra-select, select.form-control, select, [data-dropdown], select[data-field]',
checkbox: '.chakra-checkbox, input[type="checkbox"], .switch-checkbox, input[data-toggle], [data-toggle]',
slider: '.chakra-slider, .slider, input[type="range"]',
toggle: '.switch input.switch-checkbox, .toggle-switch input, input[data-toggle]',
},
// Step-specific selectors - VERIFIED from real iRacing HTML structure
steps: {
// Step 3: Race Information - form structure inside #set-session-information
// Form groups have labels followed by inputs
sessionName: '#set-session-information .card-block .form-group:first-of-type input.form-control',
sessionNameAlt: '#set-session-information input.form-control[type="text"]:not([maxlength])',
password: '#set-session-information .card-block .form-group:nth-of-type(2) input.form-control, #set-session-information input[type="password"], #set-session-information input.chakra-input[type="text"]:not([name="Current page"]):not([id*="field-:rue:"]):not([id*="field-:rug:"]):not([id*="field-:ruj:"]):not([id*="field-:rl5b:"]):not([id*="field-:rktk:"])',
passwordAlt: '#set-session-information input.form-control[maxlength="32"]',
description: '#set-session-information .card-block .form-group:last-of-type textarea.form-control',
descriptionAlt: '#set-session-information textarea.form-control',
sessionName: '#set-session-information .card-block .form-group:first-of-type input.form-control, #set-session-information [data-field="sessionName"], [data-field="sessionName"]',
sessionNameAlt: '#set-session-information input.form-control[type="text"]:not([maxlength]), input[data-field="sessionName"]',
password: '#set-session-information .card-block .form-group:nth-of-type(2) input.form-control, #set-session-information input[type="password"], #set-session-information input.chakra-input[type="text"]:not([name="Current page"]):not([id*="field-:rue:"]):not([id*="field-:rug:"]):not([id*="field-:ruj:"]):not([id*="field-:rl5b:"]):not([id*="field-:rktk:"]), #set-session-information [data-field="password"], [data-field="password"]',
passwordAlt: '#set-session-information input.form-control[maxlength="32"], input[data-field="password"]',
description: '#set-session-information .card-block .form-group:last-of-type textarea.form-control, #set-session-information textarea[data-field="description"], [data-field="description"]',
descriptionAlt: '#set-session-information textarea.form-control, textarea[data-field="description"]',
// League racing toggle in Step 3
leagueRacingToggle: '#set-session-information .switch-checkbox',
leagueRacingToggle: '#set-session-information .switch-checkbox, [data-toggle="leagueRacing"]',
// Step 4: Server Details
region: '#set-server-details select.form-control, #set-server-details [data-dropdown="region"]',
startNow: '#set-server-details .switch-checkbox, #set-server-details input[type="checkbox"]',
region: '#set-server-details select.form-control, #set-server-details [data-dropdown="region"], #set-server-details [data-dropdown], [data-dropdown="region"]',
startNow: '#set-server-details .switch-checkbox, #set-server-details input[type="checkbox"], [data-toggle="startNow"], input[data-toggle="startNow"]',
// Step 5/6: Admins
adminSearch: '.wizard-sidebar input[placeholder*="Search"], #set-admins input[placeholder*="Search"]',
adminList: '#set-admins [data-list="admins"]',
adminSearch: '.wizard-sidebar input[placeholder*="Search"], #set-admins input[placeholder*="Search"], .wizard-sidebar input[data-search], #set-admins input[data-search], input[data-field="adminSearch"]',
adminList: '#set-admins [data-list="admins"], [data-list="admins"]',
// Step 7: Time Limits - Bootstrap-slider uses hidden input[type="text"] with id containing slider name
// Also targets the visible slider handle for interaction
@@ -109,13 +109,13 @@ export const IRACING_SELECTORS = {
race: '#set-time-limit input[id*="race"], #set-time-limit .slider input[type="text"], #set-time-limit [data-slider="race"]',
// Step 8/9: Cars
carSearch: '.wizard-sidebar input[placeholder*="Search"], #set-cars input[placeholder*="Search"], .modal input[placeholder*="Search"]',
carList: '#set-cars [data-list="cars"]',
carSearch: '.wizard-sidebar input[placeholder*="Search"], #set-cars input[placeholder*="Search"], .modal input[placeholder*="Search"], input[data-search], input[data-field="carSearch"], [data-modal-trigger="car"]',
carList: '#set-cars [data-list="cars"], [data-list="cars"]',
// Add Car button - triggers car selection interface in wizard sidebar
// CORRECTED: Added fallback selectors since .icon-plus cannot be verified in minified HTML
addCarButton: '#set-cars a.btn:has(.icon-plus), #set-cars .card-header a.btn, #set-cars button:has-text("Add"), #set-cars a.btn:has-text("Add")',
// Car selection interface - CORRECTED: No separate modal, uses wizard sidebar within main modal
addCarModal: '#create-race-modal .wizard-sidebar, #set-cars .wizard-sidebar, .wizard-sidebar:has(input[placeholder*="Search"])',
addCarModal: '#create-race-modal .wizard-sidebar, #set-cars .wizard-sidebar, .wizard-sidebar:has(input[placeholder*="Search"]), [data-modal="true"], #set-cars [data-modal="true"]',
// Select button inside car table row - clicking this adds the car immediately (no confirm step)
// The "Select" button is an anchor styled as: a.btn.btn-block.btn-primary.btn-xs
carSelectButton: '.wizard-sidebar table .btn-primary.btn-xs:has-text("Select"), #set-cars table .btn-primary.btn-xs:has-text("Select"), .modal table .btn-primary:has-text("Select")',
@@ -127,7 +127,7 @@ export const IRACING_SELECTORS = {
// CORRECTED: Added fallback selectors since .icon-plus cannot be verified in minified HTML
addTrackButton: '#set-track a.btn:has(.icon-plus), #set-track .card-header a.btn, #set-track button:has-text("Add"), #set-track a.btn:has-text("Add")',
// Track selection interface - CORRECTED: No separate modal, uses wizard sidebar within main modal
addTrackModal: '#create-race-modal .wizard-sidebar, #set-track .wizard-sidebar, .wizard-sidebar:has(input[placeholder*="Search"])',
addTrackModal: '#create-race-modal .wizard-sidebar, #set-track .wizard-sidebar, .wizard-sidebar:has(input[placeholder*="Search"]), [data-modal="true"], #set-track [data-modal="true"]',
// Select button inside track table row - clicking this selects the track immediately (no confirm step)
// Prefer direct buttons (not dropdown toggles) for single-config tracks
trackSelectButton: '.wizard-sidebar table a.btn.btn-primary.btn-xs:not(.dropdown-toggle), #set-track table a.btn.btn-primary.btn-xs:not(.dropdown-toggle)',