我正在使用 Jenkins、Maven 和 Chromedriver 来执行 selenium 脚本,但在同时运行多个项目时,它给了我这个错误。 我们该如何解决这个问题呢? 我在 jenkins 上安排了多个脚本,这些脚本在代码推送到 git 时执行。
java.lang.RuntimeException: Unable to find a free port at org.openqa.selenium.net.PortProber.findFreePort(PortProber.java:67) at org.openqa.selenium.remote.service.DriverService$Builder.build(DriverService.java:351) at org.openqa.selenium.chrome.ChromeDriverService.createDefaultService(ChromeDriverService.java:94) at org.openqa.selenium.chrome.ChromeDriver.(ChromeDriver.java:157) at Check.Status.Tests.driverSetup(Tests.java:33)
最佳答案
此错误消息...
java.lang.RuntimeException: Unable to find a free port
...是 RuntimeException它是 Java 虚拟机正常运行期间可能抛出的异常的父类(super class)。
<小时/>保护 chromedriver 使用的端口
我们对端口使用无能为力,@barancev mentions ChromeDriver 尝试查找免费的 Ephemeral port使用系统相关的临时端口范围检测器。安ephemeral port是一个短暂的端点,当程序请求任何可用的用户端口时,操作系统创建该端点。操作系统从预定义的范围(通常在 1024 到 65535 之间)中选择端口号,并在相关 TCP 连接终止后释放该端口。
默认情况下,系统最多可以创建大约 4,000 个在 Windows Server 2003 上同时运行的临时端口,在 Windows Server 2008 上大约可以创建大约 16,000 个临时端口。
<小时/>You can find a detailed discussion in How do I protect the ports that chromedriver use?
问题详情
根据 @visionscaper 的 comment在Windows系统上,您需要从
C:\Windows\System32\中删除/注释掉以下类型的条目Drivers\etc\hosts
文件:127.0.0.1 my-site.local 192.168.100.48 localhost
根据 @DavidGDD 的 comment在 Linux 系统上的
PortProber.java
和LinuxEphemeralPortRangeDetector.java
中,createAcceptablePort
中存在一种情况,其中始终返回相同的端口,不是随机的。- 当您在
/proc/sys/net/ipv4/ip_local_port_range
中将端口范围定义为1024-65535
时,该方法始终返回1024. - 当您将文件中定义的范围更改为
1025-65535
(或任何其他范围)时,它将返回随机端口。
- 当您在
- @tflori mentions来自Selenium观点看法:
- LinuxEphemeralPortRangeDetector.java两个端口之间有多个空间。因此结果是
[1025, , , , 65535]
然后Integer.parseInt(split[1]);
抛出并使用默认值,这导致了与我们相同的问题没有修改下端口。 - PortProber.java我们从平台获取最高和最低端口,然后覆盖 1024 或 65535 之一。
- LinuxEphemeralPortRangeDetector.java两个端口之间有多个空间。因此结果是
解决方案
这个merge解决linux等平台上的端口协商问题。删除的代码导致 FIRST_PORT 和 LAST_PORT 都设置为 1024,并且始终返回 1024。事实上,我们应该信任检测器报告的临时端口。通过最小值和最大值,我们只需确保有效的端口范围。因此您需要确保:
- JDK 已升级到当前级别 JDK 8u222 .
- Selenium 升级至当前级别 Version 3.141.59 .
- ChromeDriver 已更新为当前 ChromeDriver v77.0级别。
- Chrome 已更新至当前 Chrome 版本 77.0 级别。 (根据 ChromeDriver v77.0 release notes )
- 通过IDE清理您的项目工作区,并仅使用所需的依赖项重建项目。
- 如果您的基本Web 客户端版本太旧,请将其卸载并安装最新的 GA 和已发布版本的Web 客户端。
- 重新启动系统。
- 以非root用户身份执行
@Test
。 - 始终在
tearDown(){}
方法中调用driver.quit()
来关闭和销毁 WebDriver 和 Web Client 优雅地实例化。
关于java - 有什么办法可以解决 "java.lang.RuntimeException: Unable to find a free port"问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57989305/