远程Tomcat部署Java应用:ChromeDriver启动后Chrome崩溃报500错误
解决Tomcat中Selenium ChromeDriver启动Chrome崩溃(DevToolsActivePort不存在)问题
问题现象
远程Apache Tomcat/10.0.23服务器上运行集成Selenium ChromeDriver的Java Web应用,ChromeDriver日志显示启动成功,但创建WebDriver时抛出HTTP 500错误,核心提示为Chrome failed to start: crashed和DevToolsActivePort file doesn't exist。
关键修复步骤
1. 补充无头模式必要启动参数
无GUI的服务器环境下,除现有参数外,需添加以下参数解决端口与渲染异常:
--remote-debugging-port=9222:明确指定调试端口,避免DevToolsActivePort检测失败--disable-gpu:禁用GPU加速,服务器环境无需该功能--window-size=1920,1080:设置固定窗口尺寸,避免无头模式下渲染异常
2. 明确指定Chrome二进制文件路径
在ChromeOptions中直接指定Chrome可执行文件路径,避免系统路径查找异常:
options.setBinary("/usr/bin/google-chrome");
3. 升级Selenium版本
当前使用的Selenium 3.14.0为2018年版本,与Chrome 110存在兼容性问题,建议升级至4.x版本(如4.11.0),新版本对Chrome无头模式、DevTools协议支持更完善,且可通过Selenium Manager自动管理驱动,无需手动设置webdriver.chrome.driver。
4. 检查Tomcat运行用户权限
确保Tomcat运行用户拥有Chrome、ChromeDriver的执行权限,以及临时目录(如/tmp)的读写权限,可通过以下命令验证:
su - tomcat-user -c "/usr/bin/google-chrome --headless=new --disable-gpu --no-sandbox --dump-dom https://google.com"
若命令执行失败,需调整文件权限或为用户添加对应权限。
修改后的Servlet代码示例
import java.io.IOException; import org.openqa.selenium.PageLoadStrategy; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @WebServlet(name = "TestServlet", urlPatterns = { "/test" }) public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ChromeOptions options = new ChromeOptions(); // 指定Chrome二进制文件路径 options.setBinary("/usr/bin/google-chrome"); options.setPageLoadStrategy(PageLoadStrategy.EAGER); options.addArguments("--headless=new"); options.addArguments("--disable-dev-shm-usage"); options.addArguments("--no-sandbox"); // 补充解决DevToolsActivePort问题的参数 options.addArguments("--remote-debugging-port=9222"); options.addArguments("--disable-gpu"); options.addArguments("--window-size=1920,1080"); WebDriver driver = new ChromeDriver(options); try { driver.get("https://www.google.com/"); String pageTitle = driver.getTitle(); System.out.println("Page Title: " + pageTitle); response.getWriter().write("Page Title: " + pageTitle); } finally { // 确保无论是否异常,驱动都能正常关闭 driver.quit(); } } }
额外说明
- 升级Selenium 4.x后,Maven依赖示例:
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.11.0</version> </dependency>
- 服务器环境建议使用官方稳定版Chrome,避免第三方编译版本带来的兼容性问题。
内容的提问来源于stack exchange,提问作者Stewart LloydJones
相关产品推荐
相关产品推荐

