【问题标题】:Is there any way to solve "java.lang.RuntimeException: Unable to find a free port" issue有什么办法可以解决“java.lang.RuntimeException: Unable to find a free port”的问题
【发布时间】:2019-09-18 09:20:42
【问题描述】:
我正在使用 Jenkins、Maven 和 Chromedriver 来执行 selenium 脚本,但是在同时运行多个项目时它给了我这个错误。
我们如何解决这个问题?
我在 jenkins 上安排了多个脚本,这些脚本在代码推送到 git 时执行。
java.lang.RuntimeException: 找不到空闲端口
在 org.openqa.selenium.net.PortProber.findFreePort(PortProber.java:67)
在 org.openqa.selenium.remote.service.DriverService$Builder.build(DriverService.java:351)
在 org.openqa.selenium.chrome.ChromeDriverService.createDefaultService(ChromeDriverService.java:94)
在 org.openqa.selenium.chrome.ChromeDriver.(ChromeDriver.java:157)
在 Check.Status.Tests.driverSetup(Tests.java:33)
【问题讨论】:
标签:
java
selenium
selenium-webdriver
webdriver
runtimeexception
【解决方案1】:
此错误消息...
java.lang.RuntimeException: Unable to find a free port
...是RuntimeException,它是在 Java 虚拟机正常运行期间可以抛出的那些异常的超类。
保护chromedriver使用的端口
对于端口使用,我们无能为力,因为@barancev mentions ChromeDriver 试图使用依赖于系统的临时端口范围检测器找到免费的Ephemeral port。 ephemeral port 是由操作系统在程序请求任何可用用户端口时创建的短期端点。操作系统从预定义的范围内选择端口号,通常在 1024 到 65535 之间,并在相关 TCP 连接终止后释放该端口。
默认情况下,系统最多可以创建大约 4,000 个在 Windows Server 2003 上并发运行的临时端口,在 Windows Server 2008 上创建大约 16,000 个。
您可以在How do I protect the ports that chromedriver use?找到详细讨论
问题详情
-
根据Windows 系统上@visionscaper 的comment,您需要删除 / 注释掉 中的以下条目类型C:\Windows\System32\Drivers\etc\hosts 文件:
127.0.0.1 my-site.local
192.168.100.48 localhost
-
根据@DavidGDD 在PortProber.java 和LinuxEphemeralPortRangeDetector.java 中Linux 系统上的comment,createAcceptablePort 中存在一种情况,它总是返回相同的端口,而不是随机的。
- 当您在
/proc/sys/net/ipv4/ip_local_port_range 中将端口范围定义为1024-65535 时,该方法始终返回1024。
- 当您将文件中定义的范围更改为
1025-65535(或任何其他范围)时,它将返回随机端口。
- @tflori mentions 来自Selenium 的观点:
解决方案
这个merge解决了linux等平台上的端口协商问题。删除的代码导致 FIRST_PORT 和 LAST_PORT 都设置为 1024,这总是返回 1024。事实上,我们应该相信检测器报告的临时端口。使用最小值和最大值,我们只是确保有效的端口范围。所以你需要确保: