fix(positions): further improve lot extraction robustness for large accounts
All checks were successful
Build and Push Docker Image / build (push) Successful in 29s

This commit is contained in:
2026-04-24 21:35:26 +00:00
parent a05ba3b8a8
commit 005162ce0e

View File

@@ -439,29 +439,6 @@ async def get_positions(
await page.wait_for_selector('#positionsDetails', timeout=45000)
await page.wait_for_timeout(1000)
# Try to expand lots using a more reliable evaluate-based approach
try:
expanded_count = await page.evaluate("""
() => {
const buttons = Array.from(document.querySelectorAll('tr.position-row sdps-button[sdps-id="costBasisTBD"] button'));
let count = 0;
buttons.forEach(btn => {
// Check if already expanded (usually has a different icon or state, but clicking again often toggles)
// For now we just click them all.
btn.click();
count++;
});
return count;
}
""")
if debug:
print(f"Clicked {expanded_count} potential lot expanders")
if expanded_count > 0:
await page.wait_for_timeout(2000) # Wait for expansion
except Exception as e:
if debug:
print(f"Error expanding lots: {e}")
await page.evaluate('window.scrollTo(0, document.body.scrollHeight)')
await page.wait_for_timeout(1500)
@@ -551,18 +528,20 @@ async def get_positions(
# Wait for modal to appear
await page.wait_for_timeout(1000)
# Find the active modal (not inert, visible)
# Find the active modal (not inert, visible, and matches our symbol)
modal_handle = None
modals = await page.query_selector_all('app-lot sdps-modal[sdps-id="open-lot-overlay"]')
for m in modals:
is_hidden = await m.evaluate('el => el.getAttribute("aria-hidden") === "true" || el.hasAttribute("inert")')
if not is_hidden:
if is_hidden:
continue
# Verify title matches symbol to avoid stale modal data
title_text = await m.evaluate('el => el.querySelector(".sdps-modal__title")?.innerText || ""')
if symbol.upper() in title_text.upper():
modal_handle = m
break
if not modal_handle and modals:
modal_handle = modals[-1] # Fallback to last one
if modal_handle:
modal_id = await modal_handle.get_attribute('modal-id')
if debug:
@@ -596,7 +575,14 @@ async def get_positions(
close_btn = await modal_handle.query_selector('button.sdps-modal__close')
if close_btn:
await close_btn.click(force=True)
await page.wait_for_timeout(1000)
# Wait for modal to actually be removed or hidden
try:
await page.wait_for_selector(f'app-lot sdps-modal[modal-id="{modal_id}"]', state='hidden', timeout=3000)
except Exception:
pass
else:
if debug:
print(f"DEBUG: Could not find matching visible modal for {symbol}")
except Exception as e:
if debug:
print(f"Error expanding lots for {symbol}: {e}")