You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多进程结合Docker Selenium Grid请求超时无法执行问题求助

Python多进程结合Docker Selenium Grid请求超时无法执行问题求助

看起来你遇到了Selenium Grid搭配多进程时的请求超时难题,我来给你梳理几个实用的排查方向和修复方案:

  • 先确认Docker Selenium Grid的运行状态
    首先用docker ps命令检查Grid Hub和Chrome Node的容器是否正常启动、没有意外退出。接着可以访问Grid的控制台页面(新版是http://127.0.0.1:4444/ui,旧版是http://127.0.0.1:4444/grid/console),看看Node是否成功注册到Hub上,有没有空闲的会话槽位。如果Node没注册上,Hub接收到请求后找不到执行节点,自然会超时等待。

  • 修正Remote Driver的初始化细节
    你的代码里有两个小问题可能导致流程卡住:

    1. webdriver.Remote的command_executor地址缺少/wd/hub路径,标准Selenium Grid配置下需要这个路径,改成http://127.0.0.1:4444/wd/hub试试;
    2. driver.page_source是属性不是方法,你写成driver.page_source()会直接报错,应该改成html = driver.page_source。
  • 多进程环境下的Driver管理注意事项
    多进程中直接在函数里初始化Driver要注意,尽量避免在主进程中提前创建相关配置对象,把Driver的初始化放到每个进程的独立执行逻辑里,减少进程间的资源冲突。另外keep_alive=False在多进程场景下可能导致连接不稳定,你可以先去掉这个参数试试。

  • 检查Docker网络配置
    如果你的Python程序在宿主机运行,要确认Grid容器的4444端口是否正确映射到宿主机,可以用curl http://127.0.0.1:4444/wd/hub/status测试连接,看能不能正常返回Grid的状态JSON。如果程序也在Docker容器内,那不能用127.0.0.1访问Grid,应该用docker-compose里Hub的服务名,比如http://selenium-hub:4444/wd/hub。

  • 优化无头模式的参数配置
    容器环境下的Chrome无头模式需要额外参数来避免权限或资源问题,建议补充这些参数:

    driveroptions = webdriver.ChromeOptions()
    driveroptions.add_argument('--headless=new')  # 新版无头模式更稳定
    driveroptions.add_argument('--no-sandbox')
    driveroptions.add_argument('--disable-dev-shm-usage')
    

这里给你修正后的示例代码,加上了异常处理避免进程卡死:

def get_discounts(self) -> list:
    discounts = []
    try:
        driveroptions = webdriver.ChromeOptions()
        driveroptions.add_argument('--headless=new')
        driveroptions.add_argument('--no-sandbox')
        driveroptions.add_argument('--disable-dev-shm-usage')
        # 修正command_executor路径
        driver = webdriver.Remote(
            command_executor='http://127.0.0.1:4444/wd/hub', 
            options=driveroptions
        )
        driver.get(self.current_url)
        html = driver.page_source  # 修正为属性调用
        # 这里可以添加你的HTML解析逻辑,提取折扣信息
        # discounts = 你的解析结果
    except Exception as e:
        print(f"请求过程出错: {str(e)}")
    finally:
        # 确保Driver无论如何都能退出
        if 'driver' in locals():
            driver.quit()
    return discounts

备注:内容来源于stack exchange,提问作者Cardinell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 08:10:28