java - 有什么办法可以解决 "java.lang.RuntimeException: Unable to find a free port"问题

标签 java selenium selenium-webdriver webdriver runtimeexception

我正在使用 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 的 commentWindows系统上,您需要从C:\Windows\System32\中删除/注释掉以下类型的条目Drivers\etc\hosts 文件:

    127.0.0.1 my-site.local
    192.168.100.48 localhost
    
  • 根据 @DavidGDD 的 commentLinux 系统上的 PortProber.javaLinuxEphemeralPortRangeDetector.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 之一。
<小时/>

解决方案

这个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 优雅地实例化。

关于java - 有什么办法可以解决 "java.lang.RuntimeException: Unable to find a free port"问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57989305/

相关文章:

java - 鼠标 clickAndHold() 在使用 Selenium Webdriver 的 Firefox 上无法正常工作

python - Selenium Chrome 看不到浏览器日志 InvalidArgumentException

java - Webdriver - 无法找到 Xpath/CSS 并出现 NoSuchElementException

python - 使用 Python 打开新窗口时,selenium window_handles 不正确

selenium - 屏幕分辨率会破坏 Selenium 测试吗?

java - 如何通过 FirefoxProfile 启动 Mozilla 浏览 session ?

java - Spring如何管理映射表(多对多)

java - Java 8 和 Felix bundle 中 Unresolved 约束

java - 找不到符号 HibernateUtil

java - 响应头是如何设置的