fix: click tooth dropdown chevron button to open 1-32 listbox, then select by number
Instead of typing into the combobox, find the toggle button ("^" icon) in the
same container as the tooth input and click it via JS to open the dropdown.
Tries progressively wider ancestor scopes (1-5 levels up) to locate the button,
falls back to JS focus if none found. Then selects the exact tooth number from
the listbox options.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -702,11 +702,36 @@ class AutomationDDMAClaimSubmit:
|
|||||||
ti = tooth_inputs[idx]
|
ti = tooth_inputs[idx]
|
||||||
self.driver.execute_script("arguments[0].scrollIntoView({block:'center'});", ti)
|
self.driver.execute_script("arguments[0].scrollIntoView({block:'center'});", ti)
|
||||||
time.sleep(0.3)
|
time.sleep(0.3)
|
||||||
# Open the dropdown via JS focus (avoids element-not-interactable on click)
|
|
||||||
self.driver.execute_script("arguments[0].focus();", ti)
|
|
||||||
time.sleep(0.5)
|
|
||||||
# Select the option matching the tooth number from the 1-32 dropdown
|
|
||||||
listbox_id = ti.get_attribute("aria-controls") or ""
|
listbox_id = ti.get_attribute("aria-controls") or ""
|
||||||
|
|
||||||
|
# Click the "^" chevron toggle button to open the dropdown.
|
||||||
|
# It lives in the same container as the tooth input —
|
||||||
|
# try progressively wider ancestor scopes.
|
||||||
|
toggle_clicked = False
|
||||||
|
for ancestor_steps in range(1, 6):
|
||||||
|
ancestor_axis = "/".join([".."] * ancestor_steps)
|
||||||
|
toggle_xpath = (
|
||||||
|
f"//input[@aria-label='Tooth'][{idx+1}]"
|
||||||
|
f"/{ancestor_axis}//button"
|
||||||
|
)
|
||||||
|
toggles = self.driver.find_elements(By.XPATH, toggle_xpath)
|
||||||
|
if toggles:
|
||||||
|
try:
|
||||||
|
self.driver.execute_script("arguments[0].click();", toggles[0])
|
||||||
|
print(f"[DDMA Claim step4] tooth[{idx}]: clicked toggle btn (ancestor depth {ancestor_steps})")
|
||||||
|
toggle_clicked = True
|
||||||
|
break
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if not toggle_clicked:
|
||||||
|
# Fallback: JS focus the input to open the combobox
|
||||||
|
self.driver.execute_script("arguments[0].focus();", ti)
|
||||||
|
print(f"[DDMA Claim step4] tooth[{idx}]: no toggle btn found, used JS focus")
|
||||||
|
|
||||||
|
time.sleep(0.5)
|
||||||
|
|
||||||
|
# Select the matching tooth number from the 1-32 listbox
|
||||||
try:
|
try:
|
||||||
if listbox_id:
|
if listbox_id:
|
||||||
option = WebDriverWait(self.driver, 5).until(
|
option = WebDriverWait(self.driver, 5).until(
|
||||||
@@ -723,7 +748,7 @@ class AutomationDDMAClaimSubmit:
|
|||||||
option.click()
|
option.click()
|
||||||
print(f"[DDMA Claim step4] tooth[{idx}]: selected '{tooth}' from dropdown")
|
print(f"[DDMA Claim step4] tooth[{idx}]: selected '{tooth}' from dropdown")
|
||||||
except TimeoutException:
|
except TimeoutException:
|
||||||
print(f"[DDMA Claim step4] tooth[{idx}]: dropdown not found, skipping")
|
print(f"[DDMA Claim step4] tooth[{idx}]: option '{tooth}' not found in dropdown")
|
||||||
time.sleep(0.3)
|
time.sleep(0.3)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[DDMA Claim step4] Could not fill tooth: {e}")
|
print(f"[DDMA Claim step4] Could not fill tooth: {e}")
|
||||||
|
|||||||
Reference in New Issue
Block a user