【问题标题】: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 portephemeral 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.javaLinuxEphemeralPortRangeDetector.javaLinux 系统上的commentcreateAcceptablePort 中存在一种情况,它总是返回相同的端口,而不是随机的。

    • 当您在/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 中的一个。

解决方案

这个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() 以优雅地关闭和销毁 WebDriverWeb Client 实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多