AWS EC2红帽实例Selenium ChromeDriver问题排查求助
问题描述
在Red Hat系统的AWS EC2实例上配置Selenium WebDriver时出现异常,当前Chrome版本为120.0.6099.109。尝试安装对应版本ChromeDriver(如120.0.6099.71)后,Python脚本间歇性故障:偶尔能正常运行,多数时候提示chrome has crashed,更换多个ChromeDriver版本无效。
本地Chrome版本信息:
$ google-chrome --version Google Chrome 120.0.6099.109
Python脚本片段:
chrome_options = webdriver.ChromeOptions() prefs = { "download.prompt_for_download": False, "plugins.always_open_pdf_externally": True, "download.open_pdf_in_system_reader": False, "profile.default_content_settings.popups": 0, "download.default_directory": file_path_descargas_guias } chrome_options.add_experimental_option('prefs', prefs) chrome_options.add_argument("--headless") chrome_options.add_argument('--no-sandbox') chrome_options.add_argument("--disable-dev-shm-usage") driver = webdriver.Chrome(options=chrome_options)
多数时候Jupyter Labs单元格长时间运行后抛出错误:
--------------------------------------------------------------------------- SessionNotCreatedException Traceback (most recent call last) Cell In[11], line 16 13 chrome_options.add_argument('--no-sandbox') 14 chrome_options.add_argument("--disable-dev-shm-usage") ---> 16 driver = webdriver.Chrome(options=chrome_options) File ~/anaconda3/lib/python3.11/site-packages/selenium/webdriver/chrome/webdriver.py:45, in WebDriver.__init__(self, options, service, keep_alive) 42 service = service if service else Service() 43 options = options if options else Options() ---> 45 super().__init__( 46 browser_name=DesiredCapabilities.CHROME["browserName"], 47 vendor_prefix="goog", 48 options=options, 49 service=service, 50 keep_alive=keep_alive, 51 ) File ~/anaconda3/lib/python3.11/site-packages/selenium/webdriver/chromium/webdriver.py:61, in ChromiumDriver.__init__(self, browser_name, vendor_prefix, options, service, keep_alive) 52 executor = ChromiumRemoteConnection( 53 remote_server_addr=self.service.service_url, 54 browser_name=browser_name, (...) 57 ignore_proxy=options._ignore_local_proxy, 58 ) 60 try: ---> 61 super().__init__(command_executor=executor, options=options) 62 except Exception: 63 self.quit() File ~/anaconda3/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py:209, in WebDriver.__init__(self, command_executor, keep_alive, file_detector, options) 207 self._authenticator_id = None 208 self.start_client() ---> 209 self.start_session(capabilities) File ~/anaconda3/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py:293, in WebDriver.start_session(self, capabilities) 286 """Creates a new session with the desired capabilities. 287 288 :Args: 289 - capabilities - a capabilities dict to start the session with. 290 """ 292 caps = _create_caps(capabilities) ---> 293 response = self.execute(Command.NEW_SESSION, caps)["value"] 294 self.session_id = response.get("sessionId") 295 self.caps = response.get("capabilities") File ~/anaconda3/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py:348, in WebDriver.execute(self, driver_command, params) 346 response = self.command_executor.execute(driver_command, params) 347 if response: ---> 348 self.error_handler.check_response(response) 349 response["value"] = self._unwrap_value(response.get("value", None)) 350 return response File ~/anaconda3/lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py:229, in ErrorHandler.check_response(self, response) 227 alert_text = value["alert"].get("text") 228 raise exception_class(message, screen, stacktrace, alert_text) # type: ignore[call-arg] # mypy is not smart enough here ---> 229 raise exception_class(message, screen, stacktrace) SessionNotCreatedException: Message: session not created: DevToolsActivePort file doesn't exist Stacktrace: #0 0x5635242acd33 <unknown> #1 0x563523f69f87 <unknown> #2 0x563523fa5e21 <unknown> #3 0x563523fa1d9f <unknown> #4 0x563523f9e4de <unknown> #5 0x563523feea90 <unknown> #6 0x563523fe30e3 <unknown> #7 0x563523fab044 <unknown> #8 0x563523fac44e <unknown> #9 0x563524271861 <unknown> #10 0x563524275785 <unknown> #11 0x56352425f285 <unknown> #12 0x56352427641f <unknown> #13 0x56352424320f <unknown> #14 0x56352429a028 <unknown> #15 0x56352429a1f7 <unknown> #16 0x5635242abed4 <unknown> #17 0x7f84fd69f802 start_thread
已将ChromeDriver加入PATH,但问题未解决,寻求以下建议:
- 适配Linux/Red Hat系统、Chrome 120.0.6099.109的推荐ChromeDriver版本;
- 在无显示硬件的AWS EC2实例上运行无头模式Selenium WebDriver的特定配置;
- 正确设置ChromeDriver路径的方法。
解决方案
1. 匹配Chrome版本的ChromeDriver
ChromeDriver版本必须与Chrome主版本完全匹配,你的Chrome是120.0.6099.109,对应ChromeDriver的正确版本是120.0.6099.71——这个版本是官方针对Chrome 120.0.6099.x发布的稳定版,不要尝试其他版本,版本不匹配是间歇性崩溃的常见原因。
2. AWS EC2无头模式优化配置
EC2实例无桌面环境,且默认/dev/shm空间有限,需补充以下配置参数:
- 明确指定现代无头模式参数:
--headless=new(旧--headless在新版Chrome中兼容性差) - 禁用GPU加速:
--disable-gpu(无硬件GPU时必须) - 设置固定窗口尺寸:
--window-size=1920,1080(避免渲染异常) - 补充资源优化参数:
--disable-extensions、--disable-plugins、--disable-background-timer-throttling(减少资源占用)
修改后的ChromeOptions配置:
chrome_options = webdriver.ChromeOptions() prefs = { "download.prompt_for_download": False, "plugins.always_open_pdf_externally": True, "download.open_pdf_in_system_reader": False, "profile.default_content_settings.popups": 0, "download.default_directory": file_path_descargas_guias } chrome_options.add_experimental_option('prefs', prefs) # 核心优化参数 chrome_options.add_argument("--headless=new") chrome_options.add_argument('--no-sandbox') chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--window-size=1920,1080") chrome_options.add_argument("--disable-extensions") chrome_options.add_argument("--disable-plugins") chrome_options.add_argument("--disable-background-timer-throttling") driver = webdriver.Chrome(options=chrome_options)
若EC2实例内存较小(如t2.micro),建议升级实例规格,或增加交换空间:
# 创建4GB交换文件 sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile
3. 正确设置ChromeDriver路径
即使加入PATH,有时因环境变量优先级问题仍会失效,建议直接指定路径:
- 将ChromeDriver解压到固定目录,例如
/usr/local/bin/chromedriver - 修改权限确保可执行:
sudo chmod +x /usr/local/bin/chromedriver
- 在Python脚本中明确指定ChromeDriver路径:
from selenium.webdriver.chrome.service import Service # 指定ChromeDriver路径 service = Service(executable_path='/usr/local/bin/chromedriver') driver = webdriver.Chrome(service=service, options=chrome_options)
验证ChromeDriver是否正常:
chromedriver --version
输出应为ChromeDriver 120.0.6099.71 (...)
内容的提问来源于stack exchange,提问作者R_Student
相关产品推荐
相关产品推荐

