Skip to content

Commit b0536a1

Browse files
author
maebahesioru
committed
fix: handle TargetClosedError gracefully and improve parameter verification
- initialization: catch TargetClosedError during page init, skip gracefully - initialization/model_management: downgrade noisy warnings to DEBUG - _set_parameter_with_retry: is_equal extracts float from strings like 'user:1.0' - _set_parameter_with_retry: input_value timeout 2s -> 5s
1 parent 3be9f2a commit b0536a1

3 files changed

Lines changed: 18 additions & 7 deletions

File tree

src/browser/initialization.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ async def _initialize_page_logic(browser: AsyncBrowser):
312312
if wrapper_locator:
313313
logger.info(f'✅ 输入框wrapper可见 (匹配: {wrapper_matched})')
314314
else:
315-
logger.warning('⚠️ 未找到任何wrapper,尝试直接查找输入框')
315+
logger.debug('⚠️ 未找到任何wrapper,尝试直接查找输入框')
316316
input_locator, matched = await wait_for_any_selector(found_page, PROMPT_TEXTAREA_SELECTORS, timeout=30000)
317317
if input_locator:
318318
logger.info(f'✅ 核心输入区域可见 (匹配: {matched})')
@@ -338,6 +338,10 @@ async def _initialize_page_logic(browser: AsyncBrowser):
338338
logger.info(f'✅ 页面逻辑初始化成功。')
339339
return (result_page_instance, result_page_ready)
340340
except Exception as input_visible_err:
341+
from playwright._impl._errors import TargetClosedError
342+
if isinstance(input_visible_err, TargetClosedError) or 'Target page, context or browser has been closed' in str(input_visible_err):
343+
logger.warning(f'页面初始化时浏览器已关闭,跳过。')
344+
raise
341345
from .operations import save_error_snapshot
342346
await save_error_snapshot('init_fail_input_timeout')
343347
logger.error(f'页面初始化失败:核心输入区域未在预期时间内变为可见。最后的 URL 是 {found_page.url}', exc_info=True)

src/browser/model_management.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ async def _handle_initial_model_state_and_storage(page: AsyncPage):
385385
except Exception as reload_err:
386386
err_str = str(reload_err)
387387
if 'Target page, context or browser has been closed' in err_str or 'Browser has been closed' in err_str:
388-
logger.warning(f' ⚠️ 浏览器已关闭,跳过重新加载。')
388+
logger.debug(f' ⚠️ 浏览器已关闭,跳过重新加载。')
389389
return
390390
logger.warning(f' ⚠️ 页面重新加载尝试 {attempt + 1}/{max_retries} 失败: {reload_err}')
391391
if attempt < max_retries - 1:

src/browser/page_controller.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -569,11 +569,18 @@ async def _control_thinking_budget_toggle(self, should_be_checked: bool, check_c
569569

570570
async def _set_parameter_with_retry(self, locator: Locator, target_value: str, param_name: str, check_client_disconnected: Callable) -> bool:
571571
def is_equal(val1, val2):
572+
import re
573+
def extract_float(s):
574+
m = re.search(r'[-+]?\d*\.?\d+', str(s))
575+
return float(m.group()) if m else None
572576
try:
573-
f1, f2 = float(val1), float(val2)
574-
return abs(f1 - f2) < 0.001
575-
except ValueError:
576-
return str(val1).strip() == str(val2).strip()
577+
f1 = extract_float(val1)
578+
f2 = float(val2)
579+
if f1 is not None:
580+
return abs(f1 - f2) < 0.001
581+
except (ValueError, TypeError):
582+
pass
583+
return str(val1).strip() == str(val2).strip()
577584

578585
max_retries = MAX_RETRIES
579586
for attempt in range(max_retries):
@@ -609,7 +616,7 @@ def is_equal(val1, val2):
609616

610617
await asyncio.sleep(SLEEP_LONG)
611618

612-
final_val = await locator.input_value(timeout=2000)
619+
final_val = await locator.input_value(timeout=5000)
613620
if is_equal(final_val, target_value):
614621
self.logger.info(f"[{self.req_id}] {param_name} 成功设置为 {final_val} (策略: {strategy_name})。")
615622
return True

0 commit comments

Comments
 (0)