【问题标题】:unknown error: DevToolsActivePort file doesn't exist error while executing Selenium UI test cases on ubuntu未知错误:在 ubuntu 上执行 Selenium UI 测试用例时,DevToolsActivePort 文件不存在错误
【发布时间】:2018-11-20 06:59:06
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

拇指规则

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


此错误消息...

unknown error: DevToolsActivePort file doesn't exist

...暗示 ChromeDriver 无法启动/生成新的 WebBrowserChrome 浏览器 会话。

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

但是根据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 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

Add an option to use /tmp instead of /dev/shmDavid 的讨论中提到:

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

至于为什么不默认使用,这是共享内存团队的推后,我想应该是默认使用/dev/shm作为共享内存。

最终这一切都应该转向使用 memfd_create,但我认为这不会很快发生,因为这需要大量重构 Chrome 内存管理。


参考

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


结尾

这是Sandbox故事的链接。

【讨论】:

  • 我们进一步调试问题,问题看起来有点不同。如果我通过 ssh 启动 google-chrome-stable,它不会启动 chrome。但是如果我们使用remmina远程控制同一台机器,然后使用终端启动chrome,它会成功启动它。
  • 嗯。在 Docker 容器内并作为正常运行 USER 我仍然看到上述错误。除了 --headless 之外,还使用 ​​--no-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】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        如果您在没有 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 与 selenium java 的 3.141.59 一起使用。

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

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

        【讨论】:

        • 如果你想保存屏幕截图,Headless 不是一个可行的选择,但我的 wdio 不会启动,即使是 headless
        • 所以不要使用无头但另一个提到的选项,并使用提到的版本来确定。不知道你对 wdio 的意思,但如果你有一个基于“未启动”的具体错误,我建议你发布一个新问题。你应该得到一个具体的错误
        【解决方案6】:

        只需使用无头模式

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

        【讨论】:

          【解决方案7】:

          尝试这种方法来实例化 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的评论

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

          【讨论】:

          • 嘿,如何将环境变量 DISPLAY 设置为现有会话?这是在 python 文件中还是在终端中完成的?谢谢。
          • 您可以从 python 脚本和终端设置环境变量 DISPLAY。但推荐的方法是在启动 python 脚本之前从终端设置它。
          【解决方案8】:

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

          export DISPLAY=:1
          

          【讨论】:

            【解决方案9】:

            我一直在使用 Selenium 的 chrome 嵌入式应用程序中收到此错误,例如 CEF 或电子应用程序。

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

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

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

            【讨论】:

              【解决方案10】:

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

              希望对某人有所帮助

              【讨论】:

              • 可能是评论。
              • 我的答案?我试过了,但我没有声誉,我不能放 cmets
              【解决方案11】:

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

              我知道这是我的愚蠢,但我认为澄清它可能会有所帮助,因为在这种情况下,因果关系之间的联系并不清楚。

              【讨论】:

                【解决方案12】:

                以上都不起作用。唯一的解决方案是使用以下位置的驱动程序:

                '/snap/bin/chromium.chromedriver'
                

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

                【讨论】:

                  【解决方案13】:

                  @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

                  【讨论】:

                    【解决方案14】:

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

                    xhost +
                    

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

                    export DISPLAY=:10.0
                    

                    【讨论】:

                      猜你喜欢
                      • 2019-07-12
                      • 1970-01-01
                      • 2019-08-01
                      • 1970-01-01
                      • 2019-05-15
                      • 1970-01-01
                      • 2020-03-25
                      • 2020-01-31
                      相关资源
                      最近更新 更多