Skip to content

Commit 13e812e

Browse files
author
maebahesioru
committed
fix: scroll into view for Google Search/stop sequence, find free port for Camoufox
- Google Search toggle: scroll_into_view_if_needed before click - Stop sequence input: scroll_into_view_if_needed before click - Camoufox: find free port on every attempt (not just retries)
1 parent 884d758 commit 13e812e

2 files changed

Lines changed: 20 additions & 7 deletions

File tree

src/browser/page_controller.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,7 @@ async def _adjust_google_search(self, request_params: Dict[str, Any], check_clie
388388
return
389389
action = '打開' if should_enable_search else '關閉'
390390
self.logger.info(f'[{self.req_id}] 🌍 (嘗試 {attempt}/{max_retries}) 正在{action} Google Search...')
391+
await toggle_locator.scroll_into_view_if_needed(timeout=3000)
391392
await toggle_locator.click(force=True, timeout=3000)
392393
await self._check_disconnect(check_client_disconnected, f'Google Search 開關 - 點擊{action}後')
393394
await asyncio.sleep(1.0)
@@ -715,6 +716,7 @@ async def _adjust_stop_sequences(self, stop_sequences, page_params_cache: dict,
715716
break
716717
if normalized_requested_stops:
717718
await expect_async(stop_input_locator).to_be_visible(timeout=5000)
719+
await stop_input_locator.scroll_into_view_if_needed(timeout=3000)
718720
for seq in normalized_requested_stops:
719721
await stop_input_locator.click(timeout=3000)
720722
await stop_input_locator.fill(seq, timeout=5000)

src/launch_camoufox.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -719,16 +719,27 @@ def determine_proxy_configuration(internal_camoufox_proxy_arg=None):
719719
camoufox_popen_kwargs['creationflags'] = subprocess.CREATE_NO_WINDOW
720720
try:
721721
logger.info(f" 将执行 Camoufox 内部启动命令: {' '.join(camoufox_internal_cmd_args)}")
722+
def _find_free_port(start_port: int, max_tries: int = 10) -> int:
723+
for p in range(start_port, start_port + max_tries):
724+
try:
725+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
726+
s.bind(('', p))
727+
return p
728+
except OSError:
729+
continue
730+
return start_port
722731
MAX_CAMOUFOX_RETRIES = 3
723732
for camoufox_attempt in range(MAX_CAMOUFOX_RETRIES):
733+
# Always find a free port (avoids EADDRINUSE on first and retry attempts)
734+
free_port = _find_free_port(args.camoufox_debug_port + camoufox_attempt)
735+
for i, arg in enumerate(camoufox_internal_cmd_args):
736+
if arg == '--internal-camoufox-port' and i + 1 < len(camoufox_internal_cmd_args):
737+
camoufox_internal_cmd_args[i + 1] = str(free_port)
738+
break
724739
if camoufox_attempt > 0:
725-
# Use a different port to avoid EADDRINUSE from previous attempt
726-
retry_port = args.camoufox_debug_port + camoufox_attempt
727-
for i, arg in enumerate(camoufox_internal_cmd_args):
728-
if arg == '--internal-camoufox-port' and i + 1 < len(camoufox_internal_cmd_args):
729-
camoufox_internal_cmd_args[i + 1] = str(retry_port)
730-
break
731-
logger.warning(f' 🔄 重试启动 Camoufox (第 {camoufox_attempt + 1}/{MAX_CAMOUFOX_RETRIES} 次, 端口: {retry_port})...')
740+
logger.warning(f' 🔄 重试启动 Camoufox (第 {camoufox_attempt + 1}/{MAX_CAMOUFOX_RETRIES} 次, 端口: {free_port})...')
741+
else:
742+
logger.info(f' 使用端口 {free_port} 启动 Camoufox...')
732743
camoufox_proc = subprocess.Popen(camoufox_internal_cmd_args, **camoufox_popen_kwargs)
733744
logger.info(f' Camoufox 内部进程已启动 (PID: {camoufox_proc.pid})。正在等待 WebSocket 端点输出 (最长 {ENDPOINT_CAPTURE_TIMEOUT} 秒)...')
734745
camoufox_output_q = queue.Queue()

0 commit comments

Comments
 (0)