Synology NAS Docker环境下Selenium driver.get抛出java.util.concurrent.TimeoutException问题求助
解决Selenium Docker容器中的TimeoutException问题
针对你在Synology NAS上运行的Kenbot股票机器人遇到的TimeoutException(Unable to execute request for an existing session: java.util.concurrent.TimeoutException),我整理了几个针对性的解决方案,建议按优先级尝试:
1. 调整Docker容器的资源分配
Synology NAS默认给容器的资源配额往往不足以支撑Chrome浏览器的运行,这是这类超时问题的常见原因:
- 打开Synology DSM的Docker套件,找到你的
selenium/standalone-chrome容器 - 进入设置 > 资源限制,至少分配2核CPU和2GB内存(如果NAS资源充足,可适当调高)
- 重启容器后重新测试
driver.get方法
2. 同步更新Selenium镜像与Python包版本
你当前使用的selenium/standalone-chrome:latest镜像搭配的是Selenium 4.0.0版本,这个旧版本存在不少兼容性问题:
- 拉取最新稳定版的Selenium镜像(可到Docker Hub确认当前最新版标签):
docker pull selenium/standalone-chrome:4.15.0 - 同时升级Python环境中的selenium包:
pip install --upgrade selenium - 重新部署容器,确保镜像与Python包版本匹配
3. 在代码中添加超时控制与显式等待
针对页面加载慢或网络波动,通过代码优化避免超时:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.common.exceptions import TimeoutException # 初始化driver后设置页面加载超时 driver.set_page_load_timeout(60) # 延长至60秒 try: driver.get("https://trade.STOCKBROKING.com.my/STOCKBROKING/research/researchvalidate.aspx?StkCode") # 等待页面核心元素加载完成,确认页面已就绪 WebDriverWait(driver, 30).until( EC.presence_of_element_located((By.TAG_NAME, "body")) ) except TimeoutException: # 超时后尝试刷新页面或重新初始化driver driver.refresh()
4. 检查NAS的网络连通性
确保NAS能稳定访问目标交易网站:
- 在NAS的控制面板 > 网络中确认网络连接正常
- 进入Docker容器内部测试网络:
docker exec -it <容器ID> ping trade.STOCKBROKING.com.my docker exec -it <容器ID> curl -I https://trade.STOCKBROKING.com.my/STOCKBROKING/research/researchvalidate.aspx?StkCode
如果网络不通,检查NAS的防火墙规则或DNS配置
5. 优化Chrome启动参数
为无头模式下的Chrome添加适配服务器环境的启动参数,减少资源占用并提升稳定性:
from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--headless=new") # 新版无头模式,兼容性更好 chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--no-sandbox") # 解决NAS环境下的权限问题 chrome_options.add_argument("--disable-dev-shm-usage") # 避免共享内存不足 chrome_options.add_argument("--window-size=1920,1080") driver = webdriver.Remote( command_executor='http://<容器IP>:4444/wd/hub', options=chrome_options )
以上方案覆盖了资源、版本、代码、网络等核心维度,多数情况下调整资源分配或同步版本就能解决问题。
内容的提问来源于stack exchange,提问作者mrkgoh
相关产品推荐
相关产品推荐

