From 4e8160ae8574a6ca6fc9891e2af37b8e78b7db8b Mon Sep 17 00:00:00 2001 From: nafer Date: Thu, 5 Mar 2026 23:54:53 +0300 Subject: [PATCH] fix(browser): implement manual Chrome launch with CDP for remote debugging When REMOTE_DEBUGGING_ENABLED is true, launch Chrome manually via subprocess and connect via CDP instead of using BrowserProfile. This improves container compatibility and provides better control over browser lifecycle. --- __pycache__/app.cpython-312.pyc | Bin 14149 -> 14699 bytes app.py | 64 +++++++++++++++++++++----------- 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/__pycache__/app.cpython-312.pyc b/__pycache__/app.cpython-312.pyc index 89acae38830f89b467bab891746178c2a4ad802d..11639c22abe5015ca60d3525b78f51c0a1b423c3 100644 GIT binary patch delta 1636 zcmZWpU2M}<6uvi(^XoWH+9qk!^e1JlT519mI_N0SuB8LJZYzEUgb{QXfEKY9BUrllHPbAhID%lY*#(m+pbbAv7r(-Ng2^dy}SR!;-)A zo$s9U-J5I2h0IgT|K#zw0J((UzeqjY{S|-9<)--+az7Io<2%=d6#aVs;lA&g7Oag;g=%awqQD}oW>)}$7s=FT)_LYC%K`{c@V}eRb6U7IsdG!A+GO6E z32PBr8K;0;s1Y@xrls(rmF58CJueJ;mYO#Qwbp6}06Nrdx^*eCv2kAKr`l`P&8Sx{n-v_?yd#cg+ksE{^2J87UiY=s` z^Tpzd5=&tDyeeT4#kF|Jk(|WxbSgV-aC~@H5XEe*B%%}^%<-a_k;U;8Ry7f4Gr6Wp zj->H;Hm!*@tK_7VJeR8%$&4CLq$N?B(WH!;k~3;9w5ckxl2yb+T27uzWhQc-&B}z5 z&2i!}x|SNxpoBb=bH@{MRvSp9-L^Ul*3U(5XUB+L0FZ3HXT=nnc6I2+9h$T0Tb0YXeIk(O4Ve10dJ=wlvF>7ZR9dO^hSM8$Uo&b z@ca^Z%=<5ml`ZcYUwhw}{ZjzkmQ^mY%7x1|5ZOL=tn2{3u<7qv*?O?pGgK6YO@DM@ za3NL{cA7$)DfF5`rz!N9LaQmXm_nr7;BMmQj+C20u>Db>^Fe@An@qxk-4BA@8>DOp z!LDb(8sz83)_73YG%wx|7mmP({^%nvTI8Z+`Np1=o&&}1gT=tm+}N*y$il=*VB5!I zYc|j-nk_rb=vK2aVuoASoNOyUcVdkL!InGnN?<>+v>7Lb3CCdwJRQ%=+l=ppGqWF& zpMRM-WP?|SJ4W_^yWMbPm-TMXP>3Y=EO4aXdXMR)JZ2$H_jXor7oWx yeyDJiz(0^_`<_+w@{BRnzxpo)sF)A{ delta 1028 zcmZuuO>7fK6rS1jI_$64b{spg6aE7sS<*s7N<|PPD@Z{q^aw4o*35R}G}!6v(t@?F z5lEGVIF!z<6%t4sK*<5*3m2p|ajQyP5~&i~AfyN(QK<(k;R6yvV#X$LXlJzF`{sM^ zeKXqkFaEutJy2B%(Dlc&+xdsP?rJwBIZTh2==Z|p$bIRjiUP_Vp2~{YLL!p<4kXVj zbD_3UUgvoq?S~~~8FW?%7G!#L)6QWhoHQit5i}TSru6-_ty!g8e^uvB= zJ~qd-EOI$wR!S+u!1kGspRIz^z2y-khDq#jo-+ z_DaaYjyph}MD{|BWb~~HW;4TVR9GYxeTd3erA`AMWy&~%BNSHTyqle}Ei^-)fhUWRU-`@bfv1&V|nvxY{y@N2bOjmT++t_{i8td3-p18DD-I6BTWs& zdxFeh5KT7)J}y-|nhMFq9GE7{u~U_A=o>Eb<_7q~cxoaB7W&|X9$HvGMERo3QGHQs zp$?f66U{KcnBHhYesP~*>Yxq){65C3Jh2~W<9u{!7(y3+6yb> i^5|;+AqW%KCmMjoTW&kvdmI1U{i3Bej*}lhe)I+aD*I#r diff --git a/app.py b/app.py index da0a3d2..54c7cb3 100644 --- a/app.py +++ b/app.py @@ -74,31 +74,51 @@ async def run_browser_task(task_id: str, task: str, max_steps: int, model: str): api_key=api_key ) - # Настройки браузера через BrowserProfile - # Если включен remote debugging - запускаем в не-headless режиме - is_headless = not REMOTE_DEBUGGING_ENABLED - - browser_profile = BrowserProfile( - user_data_dir="/app/browser-data", - profile_directory="Default", - headless=is_headless, - keep_alive=True, # Сохраняем сессию между задачами - ) - - # Добавляем remote debugging если включено - extra_args = [] + # Настройки браузера + # Если включен remote debugging - запускаем Chrome вручную и подключаемся через CDP if REMOTE_DEBUGGING_ENABLED: - extra_args = [ + import subprocess + import tempfile + + # Создаем временную директорию для профиля + user_data_dir = "/app/browser-data" + + # Запускаем Chrome с remote debugging + chrome_cmd = [ + "chromium", f"--remote-debugging-port={REMOTE_DEBUGGING_PORT}", - "--remote-debugging-address=0.0.0.0", - "--no-sandbox", # Важно для работы в контейнере - "--disable-dev-shm-usage" + f"--user-data-dir={user_data_dir}", + "--no-first-run", + "--no-default-browser-check", + "--disable-extensions", + "--disable-popup-blocking", + "--disable-gpu", + "--no-sandbox", + "about:blank" ] - - browser = Browser( - browser_profile=browser_profile, - args=extra_args - ) + + # Запускаем процесс + process = subprocess.Popen( + chrome_cmd, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL + ) + + # Даем браузеру время запуститься + await asyncio.sleep(3) + + # Подключаемся через CDP + cdp_url = f"http://localhost:{REMOTE_DEBUGGING_PORT}" + browser = Browser(cdp_url=cdp_url) + else: + # Обычный запуск + browser_profile = BrowserProfile( + user_data_dir="/app/browser-data", + profile_directory="Default", + headless=True, + keep_alive=True, + ) + browser = Browser(browser_profile=browser_profile) # Создание агента agent = Agent(