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

时间:2018-06-11 04:56:47

标签: linux google-chrome selenium selenium-webdriver selenium-chromedriver

我有一个拥有UI的ubuntu服务器。 U可以通过触发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。

13 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

使用cron作业运行硒时,我遇到了同样的问题。经过长期的苦难,我找到了解决之道。只需将以下行添加到shell脚本的开头即可:

export DISPLAY=:1

答案 2 :(得分:1)

以上都没有奏效。唯一的解决方案是从以下位置使用驱动程序:

'/snap/bin/chromium.chromedriver'

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

答案 3 :(得分:0)

此错误消息......

unknown error: DevToolsActivePort file doesn't exist

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

您的代码试用版和所有二进制文件的版本信息都会给我们一些关于错误的提示。

然而,根据Add --disable-dev-shm-usage to default launch flags似乎添加参数 --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操作系统上有效:

#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

在讨论中Add an option to use /tmp instead of /dev/shm大卫提到:

  

我认为这将取决于/ dev / shm和/ tmp的安装方式。   如果他们都被安装为tmpfs我假设没有任何区别。   如果由于某种原因/ tmp未映射为tmpfs(我认为默认情况下由systemd映射为tmpfs),Chrome共享内存管理总是在创建匿名共享文件时将文件映射到内存中,所以即使在这种情况下也不应该这样做。差别很大。我想你可以在启用标志的情况下强制进行遥测测试,看看它是怎么回事。

     

至于为什么不默认使用,它是由共享内存团队推迟的,我想有意义的是它应该默认使用/ dev / shm作为共享内存。

     

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

您还可以在org.openqa.selenium.WebDriverException: unknown error: DevToolsActivePort file doesn't exist while trying to initiate Chrome Browser

中找到详细的讨论

答案 4 :(得分:0)

我通过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)

答案 5 :(得分:0)

当我尝试以无头模式进行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

答案 6 :(得分:0)

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

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

运行本地Xvfb也应该可以,但是我建议使用无头,它可以更快。

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

答案 7 :(得分:0)

只需使用无头模式

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
driver = new ChromeDriver(options);

答案 8 :(得分:0)

尝试此方法实例化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 Pantazesanswer

的评论

答案 9 :(得分:0)

我一直在特别是在带有Selenium的铬嵌入式应用程序(例如CEF或电子应用程序)中收到此错误。

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

我遇到这个问题的原因是电子和CEF的应用。他们没有将所有chrome命令行开关转发到它们内部正在运行的Chrome实例上,因此没有创建DevToolActivePort文件。

我已经发布了一个手动流程,以便在这里回答另一个类似的问题-> https://stackoverflow.com/a/62545820/8708890。您可以按照此手动过程进行操作,看看它是否可以解决您的问题。

答案 10 :(得分:0)

使用无头Chrome驱动程序并尝试将窗口大小设置为1366x768或1600x900时,发生了这种情况。我只能通过恢复到1920x1080来解决此问题。

希望对别人有帮助

答案 11 :(得分:0)

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

我知道这是我的愚蠢,但是我认为清理一下可能会有所帮助,因为在这种情况下,因果之间的联系尚不明确。

答案 12 :(得分:0)

@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,经过几个软链接,真正的一个是/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