在 ubuntu 上执行 Selenium UI 测试用例时出现未知错误:DevToolsActivePort 文件不存在错误
- 2024-10-10 08:38:00
- admin 原创
- 76
问题描述:
我有一个 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);
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件