如何配置JUnit测试使用独立/容器化Selenium服务器
刚好做过类似的配置,我来一步步教你把JUnit测试从自动启动Selenium服务器,改成连接外部独立的服务,核心思路就是替换掉本地启动服务的逻辑,改用RemoteWebDriver连接外部的Selenium Server/Grid。
第一步:清理自动启动Selenium的代码
首先得把项目里那些自动启动本地Selenium服务的代码去掉——比如你之前用WebDriverManager自动下载启动驱动,或者ChromeDriverService这类本地服务启动的代码,直接注释或删掉就行。别留着这些代码,不然可能会和外部服务的连接逻辑冲突。
第二步:配置连接外部Selenium服务器
分两种常见场景来操作:
场景A:连接手动启动的独立Selenium Server
先手动启动Selenium Server:
去Selenium官网下载对应版本的Server jar包,然后在终端执行启动命令:java -jar selenium-server-4.x.x.jar standalone启动成功后,它会默认在
http://localhost:4444提供服务,你可以访问这个地址的控制台确认服务正常。修改JUnit测试代码:
把原来初始化本地ChromeDriver/FirefoxDriver的代码,换成RemoteWebDriver连接外部服务:import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.AfterEach; import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteWebDriver; import java.net.URL; public class ExternalSeleniumTest { private WebDriver driver; @BeforeEach public void setup() throws Exception { // 配置你要使用的浏览器能力,这里以Chrome为例 DesiredCapabilities capabilities = DesiredCapabilities.chrome(); // 替换成你的Selenium Server地址,本地启动的话就是下面这个 URL seleniumServerUrl = new URL("http://localhost:4444/wd/hub"); // 初始化RemoteWebDriver,连接外部服务 driver = new RemoteWebDriver(seleniumServerUrl, capabilities); } @Test public void testSamplePage() { driver.get("https://example.com"); // 这里写你的测试逻辑,和之前完全一样 } @AfterEach public void teardown() { if (driver != null) { driver.quit(); } } }
场景B:连接Docker容器化的Selenium Server
如果想用容器化部署Selenium,步骤更简单:
用Docker启动Selenium节点:
执行下面的命令启动一个带Chrome的Selenium独立节点,同时开放VNC端口方便你查看浏览器操作:docker run -d -p 4444:4444 -p 7900:7900 selenium/standalone-chrome:latest启动后同样可以通过
http://localhost:4444访问服务,VNC端口7900可以用VNC客户端连接查看浏览器界面(默认密码是secret)。测试代码和场景A完全一样,如果是部署在远程服务器的容器,只需要把
seleniumServerUrl换成服务器的IP地址就行,比如http://192.168.1.100:4444/wd/hub。
第三步:优化配置(可选但推荐)
别把Selenium Server的地址硬编码在代码里,可以放到配置文件里:
比如在src/test/resources下建个test.properties:
selenium.server.url=http://localhost:4444/wd/hub
然后在测试代码里读取这个配置,灵活切换环境:
// 读取配置,没有的话用默认值 String serverUrl = System.getProperty("selenium.server.url", "http://localhost:4444/wd/hub"); URL seleniumServerUrl = new URL(serverUrl);
如果是Spring Boot项目,直接用@Value("${selenium.server.url}")注入就行,更方便。
一些注意事项
- 一定要保证Selenium Server的版本和你测试代码里的Selenium Java客户端版本一致,不然容易出现兼容性问题,比如客户端是4.10.0,服务器也用4.10.0的jar包或镜像。
- 如果是远程服务器上的Selenium服务,要确保测试机器能访问到服务器的4444端口,防火墙别把这个端口挡住了。
- 容器化的话,还可以启动Selenium Grid的分布式节点,比如单独启动hub和多个浏览器节点,只需要修改
DesiredCapabilities指定要使用的浏览器即可。
内容的提问来源于stack exchange,提问作者user5047085

