如何修复启动chromedriver时出现的"[SEVERE]: bind() failed: Cannot assign requested address (99)"错误

66

我在Centos 7平台上下载了最新版本的chromedriver: https://chromedriver.storage.googleapis.com/index.html?path=74.0.3729.6/ 我启动chromedriver后出现了以下错误。

错误信息:

Starting ChromeDriver 74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}) on port 9515
Only local connections are allowed.
Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
[1556179366.141][SEVERE]: bind() failed: Cannot assign requested address (99)
我怎样解决这个问题?

enter image description here


当使用Chrome浏览器运行WebDriver时,即使浏览器正常启动,也会收到“仅允许本地连接”的消息。仅允许本地连接Chrome和Selenium webdriver。Selenium适用于ChromeDriver和Chrome浏览器以及日志消息“仅允许本地连接”。等等。 - jww
8个回答

42
在我的情况下,使用带有--verbose标志的chromedriver运行可以帮助找出问题:
[1564749154.010][SEVERE]: bind() failed: Cannot assign requested address (99)
[1564749154.011][INFO]: listen on IPv6 failed with error ERR_ADDRESS_INVALID

Chrome试图监听IPv6地址,但在Docker中未启用。您可以启用IPv6支持(仅适用于Linux主机),或者忽略该错误,因为chromedriver进程将始终侦听IPv4。

9
你好,如何“忽略错误”?在我的情况下,容器停止了,当时我什么都没做。 - sww176
@sww176 或许在你的情况下是其他原因导致了错误。你得到了完全相同的输出吗?在我的情况下,即使打印出错误消息,该进程仍然继续工作。 - Yaroslav Admin
1
这是同样的错误。我添加了 --verbose 标志,chromedriver.log 显示 [1564749154.011][INFO]: listen on IPv6 failed with error ERR_ADDRESS_INVALID。我通过添加 --whitelisted-ips 到 webdriver 参数来解决了这个问题。感谢您的帮助。 - sww176

27

简而言之:您需要将--whitelisted-ips=传递到ChromeDriver中(而不是Chrome!)

您可以以不同的方式实现这一点(取决于您的环境设置):

如果您直接从代码中使用ChromeDriver(而不是使用RemoteWebDriver),只需在ChromeDriver初始化之前插入以下行:

    System.setProperty("webdriver.chrome.whitelistedIps", "");

如果您远程使用它(例如使用selenium hub/grid),则需要在节点启动时设置系统属性,如以下命令:

java -Dwebdriver.chrome.whitelistedIps= testClass etc...

通过传递 JAVA_OPTS 环境变量来使用 Docker

  chrome:
    image: selenium/node-chrome:3.141.59
    container_name: chrome
    depends_on:
      - selenium-hub
    environment:
      - HUB_HOST=selenium-hub
      - HUB_PORT=4444
      - JAVA_OPTS=-Dwebdriver.chrome.whitelistedIps=

9
那是什么原因? - User Rebo

13
我成功地通过添加下面所示的参数来解决了这个问题(Python)。
options = webdriver.ChromeOptions()
options.add_argument('--disable-dev-shm-usage')

以下内容来自Google故障排除技巧:

默认情况下,Docker运行容器时使用的共享内存空间是64MB的/dev/shm。这通常对Chrome来说太小了,在渲染大页面时会导致Chrome崩溃。要解决此问题,请使用docker run --shm-size=1gb以增加/dev/shm的大小。 自Chrome 65起,这不再是必需的。相反,使用--disable-dev-shm-usage标志启动浏览器


4
可能仅适用于Windows上的Docker,因为自从升级到新版本后,这个问题只是在几天前才开始出现。 - Steve Desmond
3
如果你的 shm 大小太小了(通常在 Docker 环境中),这将解决问题。请参见 https://developers.google.com/web/tools/puppeteer/troubleshooting#running_on_alpine。 - Gene

5
原因在别处。当我在 Docker 容器上运行 Chrome 时,将驱动程序以无界面模式运行就可以解决这个问题。
ChromeOptions options = new ChromeOptions().setHeadless(true);
WebDriver driver = new ChromeDriver(options);

结果:现在测试成功运行,没有任何错误。


3

我在我的团队中遇到了同样的问题,但我们的解决方案是全新的。 可能是因为根本原因不同,尽管可见的错误消息是相同的。

这个问题在我们的CI/CD流水线中开始出现了5天。 我们意识到在同一时间,新的selenium/standalone-chrome docker镜像被推送到了selenium docker hub。

https://hub.docker.com/r/selenium/standalone-chrome/tags

最新的图片导致了这个错误。在过去1.5年的时间里从未发生过。但是在使用最新的图片时发生了。该图片的摘要为:9943ba9d2a89e984080f5681b390229fb47f7d3bb732e4f440456fc52335bae8。
解决方案是将我们Jenkins使用的图片恢复到21天前推出的selenium/standalone-chrome docker图片。摘要为:bc4023992691ab8e2f20297f334fdcddd982928fbd969239b39b3dbc2dfc0657。
我们计划检查即将发布的新图片,以确保与我们的CI/CD兼容,以便我们可以更新到最新的selenium图片。
谢谢。

1

我曾经遇到过类似的问题;我的问题是没有退出现有的驱动程序,然后尝试再次使用。 driver.quit() 解决了我的问题。


0

当我尝试在容器ubuntu:20.04中运行Java测试时,遇到了这个问题。从这个指南中提取了以下内容Selenium: WebDriverException:Chrome failed to start: crashed as google-chrome is no longer running so ChromeDriver is assuming that Chrome has crashed

ChromeOptions options = new ChromeOptions();
options.addArguments("--no-sandbox", "--headless", "--window-size=1024x768");

有一些帖子声称--no-sandbox必须放在第一位,但我进行了实验,发现这并非必要,至少在Java中不是。


0
在我的情况下,有2个Docker容器正在运行,并且Selenium使用了端口4444。关闭一个容器解决了另一个容器的问题。消息仍然存在,但测试正在运行。之前它们一直卡住。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接