在 ubuntu 上执行 Selenium UI 测试用例时出现未知错误:DevToolsActivePort 文件不存在错误

2024-10-10 08:38:00
admin
原创
76
摘要:问题描述:我有一个 ubuntu 服务器,也带有 UI。您可以通过触发 mvn test 命令来执行测试用例。但问题是,当我从另一台机器通过终端对机器进行 ssh 时,我收到以下错误-unknown error: DevToolsActivePort file doesn't exist ...

问题描述:

我有一个 ubuntu 服务器,也带有 UI。您可以通过触发 mvn test 命令来执行测试用例。但问题是,当我从另一台机器通过终端对机器进行 ssh 时,我收到以下错误-

unknown error: DevToolsActivePort file doesn't exist
  (Driver info: chromedriver=2.40.565383 (76257d1ab79276b2d53ee976b2c3e3b9f335cde7),platform=Linux 4.4.0-121-generic x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 60.04 seconds
Build info: version: '3.8.1', revision: '6e95a6684b', time: '2017-12-01T18:33:54.468Z'
System info: host: 'ubuntu-test', ip: 'X.X.X.X', os.name: 'Linux', os.arch: 'amd64', os.version: '4.4.0-121-generic', java.version: '1.8.0_171'
Driver info: driver.version: ChromeDriver

但是如果我通过 remmina 远程控制机器,然后在该机器的终端上执行相同的命令,则相同的命令可以成功启动 chrome。


解决方案 1:

经验法则

Chrome 在启动时崩溃的一个常见原因是在 Linux 上以root用户 ( administrator) 身份运行 Chrome。虽然可以--no-sandbox在创建 WebDriver 会话时传递标志来解决此问题,但这种配置不受支持且极不鼓励。您需要将环境配置为以普通用户身份运行 Chrome。


此错误信息...

unknown error: DevToolsActivePort file doesn't exist

...意味着ChromeDriver无法启动/生成新的WebBrowser,即Chrome 浏览器会话。

您的代码试验和所有二进制文件的版本信息会为我们提供一些关于哪里出了问题的提示。

但是,按照将 --disable-dev-shm-usage 添加到默认启动标志似乎添加该参数--disable-dev-shm-usage可以暂时解决问题。

如果您希望启动/跨越新的Chrome 浏览器会话,则可以使用以下Java解决方案:

System.setProperty("webdriver.chrome.driver", "C:\path\to\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
options.addArguments("start-maximized"); // open Browser in maximized mode
options.addArguments("disable-infobars"); // disabling infobars
options.addArguments("--disable-extensions"); // disabling extensions
options.addArguments("--disable-gpu"); // applicable to windows os only
options.addArguments("--no-sandbox"); // Bypass OS security model
WebDriver driver = new ChromeDriver(options);
driver.get("https://google.com");

禁用 dev-shm 使用

按照base_switches.cc disable-dev-shm-usage似乎仅在Linix OS上有效:

#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
// The /dev/shm partition is too small in certain VM environments, causing
// Chrome to fail or crash (see http://crbug.com/715363). Use this flag to
// work-around this issue (a temporary directory will always be used to create
// anonymous shared memory files).
const char kDisableDevShmUsage[] = "disable-dev-shm-usage";
#endif

在讨论添加使用 /tmp 而不是 /dev/shm 的选项中, David 提到:

我认为这取决于 /dev/shm 和 /tmp 是如何挂载的。如果它们都挂载为 tmpfs,我假设不会有任何区别。如果出于某种原因 /tmp 没有映射为 tmpfs(我认为 systemd 默认将其映射为 tmpfs),chrome 共享内存管理在创建匿名共享文件时始终将文件映射到内存中,因此即使在这种情况下也不会有太大区别。我想您可以强制遥测测试并启用该标志,然后看看情况如何。

至于为什么不默认使用,这是被共享内存团队推迟的,我猜默认应该使用 /dev/shm 作为共享内存是有道理的。

最终,所有这些都应该转向使用 memfd_create,但我不认为这会很快发生,因为它需要显著重构 Chrome 内存管理。


参考

您可以在以下位置找到一些详细的讨论:

  • org.openqa.selenium.WebDriverException:未知错误:尝试启动 Chrome 浏览器时 DevToolsActivePort 文件不存在

  • 测试立即失败并出现未知错误:通过 systemd 运行 Selenium 网格时,DevToolsActivePort 文件不存在


结尾

这是Sandbox故事的链接。

解决方案 2:

我使用python来配置

import os
from selenium import webdriver 
from selenium.webdriver.chrome.options import Options 

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("no-sandbox")
chrome_options.add_argument("--disable-extensions")
chrome_options.add_argument("--headless")
driver = os.path.join("path/of/driver","chromedriver")

browser = webdriver.Chrome(executable_path=driver,chrome_options=chrome_options)
browser.get("https://www.example.com")
print(browser.title)

解决方案 3:

因为@DebanjanB 的答案是正确的,但不清楚。

问题修复后,解决方案总结到这里:

问题:运行 selenium,但出现错误

代码:

from selenium import webdriver
chromeOptions = webdriver.ChromeOptions()
chromeOptions.add_argument('--headless’)
driver = webdriver.Chrome(options=chromeOptions)

运行但出现错误:

selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally.
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)

原因

  • 直接原因

+ `unknown error: DevToolsActivePort file doesn't exist`表示 ChromeDriver 生成 WebBrowser(Chrome 浏览器会话)失败
  • 根本原因

+ 使用**ROOT**运行Chrome,会出现这个错误

解决方案

(推荐)正确解决方案

使用普通用户运行 Chrome

如何使用普通用户运行chrome?

我的情况:在 CentOS 中

(1)将 chrome 二进制文件更改为普通用户拥有的

sudo chown limao:limao /opt/google/chrome/google-chrome

注意:这里的 chrome 二进制文件/usr/bin/google-chrome经过了几个软链接,指向真正的 chrome 二进制文件/opt/google/chrome/google-chrome

更改所有者后:

limao@localhost:~/dev/ShortLinkParseServer/logs    $ ll /usr/bin/google-chrome
lrwxrwxrwx 1 root root 31 Aug  4 16:30 /usr/bin/google-chrome -> /etc/alternatives/google-chrome
limao@localhost:~/dev/ShortLinkParseServer/logs    $ ll /etc/alternatives/google-chrome 
lrwxrwxrwx 1 root root 29 Aug  4 16:30 /etc/alternatives/google-chrome -> /usr/bin/google-chrome-stable
limao@localhost:~/dev/ShortLinkParseServer/logs    $ ll /opt/google/chrome/google-chrome 
-rwxr-xr-x 1 limao limao 1.9K Jul 31 04:46 /opt/google/chrome/google-chrome

(2)设置普通用户运行supervisord spawn程序

添加user=xxx到你的supervisord config file,就像这样:

$ cat /etc/supervisord.d/supervisord_ShortLinkParseServer.conf 

[program:ShortLinkParseServer]
command=/xxx/gunicorn/gunicorn_config.py app:app
...
; use normal user instead default root use, to avoid later chrome exception: unknown error: DevToolsActivePort file doesn't exist
user=limao
...

解决方法(有待验证

添加标志--disable-dev-shm-usage

chromeOptions.add_argument('--disable-dev-shm-usage')

错误的解决方案

太多人使用这个:添加标记--no-sandbox

--no-sandbox只是意味着不使用沙盒

-> 真正的效果只是绕过操作系统安全模型

-> 因此强烈建议使用--no-sandbox

解决方案 4:

当我尝试在无头模式下进行 selenium UI 测试用例时遇到了类似的问题。

发生这种情况是因为我没有显示服务器。启动 Xvfb 对我来说是可行的。

sudo yum -y install Xvfb libXfont Xorg

sudo yum -y groupinstall "X Window System" "Desktop" "Fonts" "General Purpose Desktop"

Xvfb :99 -screen 0 1024x768x24 &

export DISPLAY=:1

解决方案 5:

尝试在没有sudo特权的情况下运行 selenium-server:

java -jar path/to/selenium-server-standalone.jar

解决方案 6:

当我使用 cron 作业运行 selenium 时,我遇到了同样的问题。经过长时间的煎熬,我找到了解决问题的方法。只需将此行添加到 shell 脚本的开头:

export DISPLAY=:1

解决方案 7:

如果您从 ssh 运行而没有 X-forward,您的 chrome 浏览器将崩溃。为防止这种情况,您可以使用 DebanjanB 发布的选项,最重要的是 --headless。如果以 root 身份运行(不推荐),您还需要 --no-sandbox。

当我将旧版本的 selenium-java (3.5.3) 与较新的 chromedriver (75.x) 一起使用时,也遇到了此错误。对于我来说,将 2.46 版本的 chromedriver 与 3.5.3 一起使用或将 75.x 与 3.141.59 版本的 selenium java 一起使用是可行的。

运行本地 Xvfb 也应该可行,但我建议使用无头式,这样速度会更快。

检查建议的重复帖子,并请更新并将对您有帮助的内容标记为已解决。

解决方案 8:

我在嵌入了 Selenium 的 chrome 应用程序中(例如 CEF 或 electron 应用程序)一直收到此错误。

使用参数--headless--no-sandbox--disable-gpu不是解决方案。

导致我出现问题的原因是 electron 和 CEF 应用程序。它们没有将所有 chrome 命令行开关转发到其中正在运行的 Chrome 实例上,因此无法创建 DevToolActivePort 文件。

我在回答另一个类似问题时发布了一个手动流程供大家参考,网址为
https://stackoverflow.com/a/62545820/8708890。您可以按照此手动流程操作,看看是否能解决您的问题。

解决方案 9:

以上方法均无效。唯一的解决方案是使用以下位置的驱动程序:

'/snap/bin/chromium.chromedriver'

这个问题解释了这一点:
https://stackoverflow.com/a/61980562/1568464

解决方案 10:

尝试这种方法来实例化 chrome web 驱动程序可以帮助您解决 ubuntu 中的这个问题:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

opt = Options()
opt.add_argument("--no-sandbox")
opt.add_argument("--disable-dev-shm-usage")

driver = webdriver.Chrome(chrome_options=opt, 
    executable_path='<your-chromedriver-path>')
driver.get('https://www.google.com/')

感谢@ George Pantazes对答案的评论

并确保DISPLAY已将环境变量设置为您将启动 Chrome 浏览器的终端中的现有会话。

解决方案 11:

我将其作为 GitHub Action 运行,但没有添加options.addArguments("--headless")。一旦我将其放入,故障就消失了。此线程中的其他各种建议都无济于事。

我知道这是我的愚蠢,但我认为坦白地说出这一点可能会有所帮助,因为这个案例中的因果关系并不是立即明确的。

解决方案 12:

我在运行 gitlab-runner 时遇到了这个问题。在主显示控制台,运行 xhost + 以允许远程显示访问:

xhost +

在.gitlab-ci.yml中,我设置了DISPLAY(假设它是:10.0):

export DISPLAY=:10.0

解决方案 13:

对我来说,问题是 /tmp/Crashpad 文件夹归 root 所有,并且我的用户 (centos) 无法写入。我做了以下操作,一切正常:

chmod 664 -R /tmp/Crashpad

google-chrome我尝试以尝试运行 selenium 的用户(centos)的身份直接从终端运行二进制文件来调试这个问题。

这样做之后,我得到了以下错误,这有助于我调试:

[19:11][centos@my.computer.com ~]$ /usr/bin/google-chrome --headless
[0110/191116.894836:ERROR:filesystem_posix.cc(63)] mkdir /tmp/Crashpad/new: Permission denied (13)

解决方案 14:

通过卸载 dbus 解决
conda remove dbus

解决方案 15:

我使用无头 chrome 驱动程序并尝试将窗口大小设置为 1366x768 或 1600x900 时也遇到了这种情况。我只能通过返回 1920x1080 来修复它。

解决方案 16:

对于 GitHub Actions

对于在 CI/CD 环境(我的情况是 GitHub Actions)上运行测试时遇到此错误的人,我之所以会遇到此问题,是因为我试图将 GitHub 运行器的默认 Chrome 版本替换为早期版本以解决此问题。我最终用一个简单的命令替换了我的rm和命令,将默认的 Chrome 二进制文件(位于)符号链接到我新下载的二进制文件,效果很好。获取我的构建mv`ln`usr/bin/google-chrome

以下是我的 GitHub Actions 工作流程的相关部分:

  - name: Downgrade Chrome browser to v114
    uses: browser-actions/setup-chrome@v1
    with:
      chrome-version: 1134343 # Last commit number for Chrome v114
    id: setup-chrome
  - run: sudo ln -fs ${{ steps.setup-chrome.outputs.chrome-path }} /usr/bin/google-chrome
  - name: Downgrade Chrome driver to v114
    run: php artisan dusk:chrome-driver `/usr/bin/google-chrome --version | cut -d " " -f3 | cut -d "." -f1`

解决方案 17:

只需使用无头模式

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
driver = new ChromeDriver(options);
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用