From a04176538e92b344e1aed6a2068ba40b8097597e Mon Sep 17 00:00:00 2001 From: ff Date: Tue, 16 Jun 2026 14:29:36 -0400 Subject: [PATCH] fix: retry MH eligibility extraction to handle AngularJS late binding Co-Authored-By: Claude Sonnet 4.6 --- ...lenium_MH_eligibilityHistoryCheckWorker.py | 60 ++++++++++--------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/apps/SeleniumService/selenium_MH_eligibilityHistoryCheckWorker.py b/apps/SeleniumService/selenium_MH_eligibilityHistoryCheckWorker.py index bc22d80a..7613b13e 100644 --- a/apps/SeleniumService/selenium_MH_eligibilityHistoryCheckWorker.py +++ b/apps/SeleniumService/selenium_MH_eligibilityHistoryCheckWorker.py @@ -213,33 +213,39 @@ class AutomationMassHealthEligibilityHistoryCheck: ) ) - for status_label, elig_flag in [("Eligible", "Y"), ("Ineligible", "N")]: - rows = self.driver.find_elements( - By.XPATH, - f"//h4[text()='{status_label}']/following::table[1]/tbody/tr" - ) - for row in rows: - cells = row.find_elements(By.TAG_NAME, "td") - if len(cells) < 3: - continue - member_number = self._cell_text(cells[2]) - norm_cell = self._normalize_id(member_number) - norm_self = self._normalize_id(self.memberId) - if norm_self and norm_cell and (norm_self in norm_cell or norm_cell in norm_self): - full_name = self._cell_text(cells[4]) if len(cells) > 4 else "" - plan_name = ( - self._cell_text(cells[6]) if len(cells) > 6 - else (self._cell_text(cells[-1]) if len(cells) > 4 else "") - ) - name_parts = full_name.split() - extracted = { - "eligibility": elig_flag, - "firstName": name_parts[0] if name_parts else "", - "lastName": " ".join(name_parts[1:]) if len(name_parts) > 1 else "", - "insurance": plan_name, - } - print(f"[extraction] MATCHED {status_label} → name='{full_name}' plan='{plan_name}'") - return extracted + # AngularJS populates cell text after elements appear in the DOM. + # Retry a few times until a row with non-empty cell[2] is found. + for attempt in range(4): + for status_label, elig_flag in [("Eligible", "Y"), ("Ineligible", "N")]: + rows = self.driver.find_elements( + By.XPATH, + f"//h4[text()='{status_label}']/following::table[1]/tbody/tr" + ) + for row in rows: + cells = row.find_elements(By.TAG_NAME, "td") + if len(cells) < 3: + continue + member_number = self._cell_text(cells[2]) + norm_cell = self._normalize_id(member_number) + norm_self = self._normalize_id(self.memberId) + if norm_self and norm_cell and (norm_self in norm_cell or norm_cell in norm_self): + full_name = self._cell_text(cells[4]) if len(cells) > 4 else "" + plan_name = ( + self._cell_text(cells[6]) if len(cells) > 6 + else (self._cell_text(cells[-1]) if len(cells) > 4 else "") + ) + name_parts = full_name.split() + extracted = { + "eligibility": elig_flag, + "firstName": name_parts[0] if name_parts else "", + "lastName": " ".join(name_parts[1:]) if len(name_parts) > 1 else "", + "insurance": plan_name, + } + print(f"[extraction] MATCHED {status_label} → name='{full_name}' plan='{plan_name}'") + return extracted + if attempt < 3: + print(f"[extraction] cells not yet populated (attempt {attempt + 1}), retrying...") + time.sleep(1.5) print(f"[extraction] No matching row for memberId='{self.memberId}'") return {"eligibility": None}