Docker中Selenium Remote连接Chrome驱动时会话创建失败
在Docker中运行Selenium时连接被拒绝的问题
我的目标是在Docker中运行Selenium。虽然selenium-standalone-chrome运行正常,也能在本地浏览器访问http://127.0.0.1:4444,但驱动连接时仍被拒绝。
相关代码
chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--disable-extensions") chrome_options.add_argument("--disable-infobars") chrome_options.add_argument("--start-maximized") chrome_options.add_argument("--disable-notifications") chrome_options.add_argument('--headless') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') driver = webdriver.Remote( command_executor='http://127.0.0.1:4444/wd/hub', options=chrome_options )
报错信息
Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.10/bin/flask", line 8, in <module> sys.exit(main()) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/flask/cli.py", line 1047, in main cli.main() File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/click/core.py", line 1055, in main rv = self.invoke(ctx) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/click/core.py", line 1657, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/click/core.py", line 1404, in invoke return ctx.invoke(self.callback, **ctx.params) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/click/core.py", line 760, in invoke return __callback(*args, **kwargs) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/click/decorators.py", line 84, in new_func return ctx.invoke(f, obj, *args, **kwargs) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/click/core.py", line 760, in invoke return __callback(*args, **kwargs) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/flask/cli.py", line 911, in run_command raise e from None File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/flask/cli.py", line 897, in run_command app = info.load_app() File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/flask/cli.py", line 308, in load_app app = locate_app(import_name, name) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/flask/cli.py", line 218, in locate_app __import__(module_name) File "/Volumes/T7Touch/Learn/p2---final-project-ftds-016-rmt-group-001/scraping-2/deployment/app.py", line 2, in <module> from util.scrapeutil import get_db File "/Volumes/T7Touch/Learn/p2---final-project-ftds-016-rmt-group-001/scraping-2/deployment/util/scrapeutil.py", line 22, in <module> driver = webdriver.Remote( File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 272, in __init__ self.start_session(capabilities, browser_profile) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 364, in start_session response = self.execute(Command.NEW_SESSION, parameters) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 429, in execute self.error_handler.check_response(response) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/selenium/webdriver/remote/errorhandler.py", line 243, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.SessionNotCreatedException: Message: Could not start a new session. Error while creating session with the driver service. Stopping driver service: Could not start a new session. Response code 500. Message: unknown error: Chrome failed to start: crashed. (unknown error: DevToolsActivePort file doesn't exist) (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.) Host info: host: '07a1292de76f', ip: '172.17.0.2' Build info: version: '4.7.1', revision: 'c6795baf1a3' System info: os.name: 'Linux', os.arch: 'amd64', os.version: '5.10.124-linuxkit', java.version: '11.0.17' Driver info: driver.version: unknown Build info: version: '4.7.1', revision: 'c6795baf1a3' System info: os.name: 'Linux', os.arch: 'amd64', os.version: '5.10.124-linuxkit', java.version: '11.0.17' Driver info: driver.version: unknown Stacktrace: at org.openqa.selenium.grid.node.config.DriverServiceSessionFactory.apply (DriverServiceSessionFactory.java:202) at org.openqa.selenium.grid.node.config.DriverServiceSessionFactory.apply (DriverServiceSessionFactory.java:69) at org.openqa.selenium.grid.node.local.SessionSlot.apply (SessionSlot.java:147) at org.openqa.selenium.grid.node.local.LocalNode.newSession (LocalNode.java:379) at org.openqa.selenium.grid.distributor.local.LocalDistributor.startSession (LocalDistributor.java:645) at org.openqa.selenium.grid.distributor.local.LocalDistributor.newSession (LocalDistributor.java:564) at org.openqa.selenium.grid.distributor.local.LocalDistributor$NewSessionRunnable.handleNewSessionRequest (LocalDistributor.java:818) at org.openqa.selenium.grid.distributor.local.LocalDistributor$NewSessionRunnable.lambda$run$1 (LocalDistributor.java:779) at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1128) at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:628) at java.lang.Thread.run (Thread.java:829)
补充信息
我使用的是Mac M1芯片,之前错误使用了selenium-standalone-chrome镜像,正确的启动命令应该是:
docker run -d -p 4444:4444 --shm-size="2g" seleniarm/standalone-chromium
解决方案
1. 确保使用适配M1芯片的镜像
Mac M1是ARM架构,selenium-standalone-chrome为x86架构镜像,即使能启动也会因架构不兼容导致Chrome崩溃。必须使用ARM架构的镜像:
docker run -d -p 4444:4444 --shm-size="2g" seleniarm/standalone-chromium
启动后等待1-2分钟,待镜像完全初始化后再尝试连接。
2. 调整ChromeOptions参数
针对ARM架构的Chromium,补充关键参数解决DevToolsActivePort错误:
chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--disable-extensions") chrome_options.add_argument("--disable-infobars") chrome_options.add_argument("--start-maximized") chrome_options.add_argument("--disable-notifications") chrome_options.add_argument('--headless=new') # 替换旧--headless参数,适配新版Chromium chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') chrome_options.add_argument('--remote-debugging-port=9222') # 指定调试端口,解决端口文件缺失问题 chrome_options.add_argument('--user-data-dir=/tmp/chrome-user-data') # 指定临时用户数据目录
3. 验证Selenium Grid状态
启动镜像后,访问http://127.0.0.1:4444/ui,确认节点状态为ready后再执行代码。
4. 检查端口与网络
用lsof -i :4444检查本地4444端口是否被占用,若被占用则修改Docker映射端口(如-p 4445:4444),同时更新代码中的command_executor地址。
内容的提问来源于stack exchange,提问作者Jason Rich Darmawan
相关产品推荐
相关产品推荐

