使用Test Container运行Selenium测试失败问题排查
解决TestContainers+Selenide设置WebDriver导致Chrome崩溃的问题
在Docker环境下使用TestContainers运行Selenium测试时,调用WebDriverRunner.setWebDriver(browser.getWebDriver())会触发Chrome启动失败,报错SessionNotCreatedException: Could not start a new session,但移除该行代码后测试可正常运行,且已确认TestContainers容器已成功启动。
核心原因
Selenide自带WebDriver实例管理逻辑,直接将TestContainers返回的RemoteWebDriver实例强制设置给WebDriverRunner,会打乱Selenide内部的初始化流程,引发Chrome进程启动冲突,最终导致崩溃。
修复步骤
1. 用Selenide远程配置替代直接设置WebDriver
放弃WebDriverRunner.setWebDriver()调用,通过Selenide的Configuration类指定TestContainers提供的Selenium远程地址,让Selenide自行创建适配的WebDriver实例:
public class ChromeExtension implements BeforeEachCallback { private BrowserWebDriverContainer browser; @Override public void beforeEach(ExtensionContext context) throws Exception { ChromeOptions chromeOptions = new ChromeOptions(); chromeOptions.addArguments("--no-sandbox", "--headless", "--disable-dev-shm-usage", "--disable-extensions", "--disable-gpu"); // 移除容器环境下不必要的--remote-debugging-port参数,避免端口绑定冲突 browser = new BrowserWebDriverContainer() .withCapabilities(chromeOptions); browser.start(); // 配置Selenide连接到TestContainers的Selenium服务 Configuration.remote = browser.getSeleniumAddress(); Configuration.browser = "chrome"; // 可选:延长超时时间,确保容器服务完全就绪 Configuration.timeout = 10000; } }
2. 优化Chrome启动参数
删除--remote-debugging-port=9222参数:TestContainers默认不会暴露该端口,强行指定会导致Chrome无法正常绑定端口,进而触发崩溃。
3. 增加容器资源限制(可选)
若Chrome因内存不足崩溃,可为容器分配更多资源:
browser = new BrowserWebDriverContainer() .withCapabilities(chromeOptions) .withMemoryLimit(1024 * 1024 * 1024) // 分配1GB内存 .withStartupTimeout(Duration.ofMinutes(2)); // 延长启动超时时间
4. 检查依赖兼容性(可选)
当前使用的Selenide 5.20.1与TestContainers 1.16.3版本兼容,但如果问题仍存在,可尝试升级至较新版本:
- Selenide升级至6.x系列
- TestContainers升级至1.17.x及以上版本
内容的提问来源于stack exchange,提问作者G.Khandal
相关产品推荐
相关产品推荐

