【问题标题】:Unknown error: Chrome failed to start: exited abnormally未知错误:Chrome 无法启动:异常退出
【发布时间】:2014-04-20 21:49:27
【问题描述】:

当我使用 chromedriver 使用 Selenium 运行测试时出现此错误。

selenium.common.exceptions.WebDriverException: Message:
unknown error: Chrome failed to start: exited abnormally
(Driver info: chromedriver=2.9.248316,platform=Linux 3.8.0-29-generic x86)

我确实下载了 google-chrome stable 和 chromedriver,并使用此代码启动了浏览器。

driver = webdriver.Chrome('/usr/local/bin/chromedriver')

有什么建议吗?谢谢。

【问题讨论】:

    标签: python python-2.7 testing selenium-chromedriver


    【解决方案1】:

    对于 Linux:

    在启动 Chrome 之前启动 Display。更多信息请点击here

    from pyvirtualdisplay import Display
    display = Display(visible=0, size=(800, 800))  
    display.start()
    driver = webdriver.Chrome()
    

    【讨论】:

    • 嗨,你能解释一下为什么需要 pyvirtualdisplay 吗?
    • 需要运行命令>>“pip install pyvirtualdisplay”和>>“sudo apt-get install xvfb”
    • 可见标志有什么作用?无论是否指定,我都看不到任何显示
    • 一个很好的解决方案!我使用选项--headless 运行我的驱动程序,它突然不再是一个选项并导致错误和困扰。这一下子解决了这个问题。 @vikramvi 关于安装 xvfb 的注释也很有帮助。谢谢!
    【解决方案2】:

    为了帮助调试此问题,您可以使用 selenium webdriver 的 service_log_pathservice_args 参数来查看 chromedriver 的输出:

    service_log_path = "{}/chromedriver.log".format(outputdir)
    service_args = ['--verbose']
    driver = webdriver.Chrome('/path/to/chromedriver',
            service_args=service_args,
            service_log_path=service_log_path)
    

    我收到了同样的异常消息,并找到了两种解决方法;我不确定 OP 的问题是否相同,但如果不是,chromedriver 日志有望有所帮助。查看我的日志,我发现 chromedriver(我在尝试解决此问题时尝试从 2.9 降到 2.6)以一种非常意想不到的方式决定运行哪个浏览器。在我的 chromedriver 所在的目录中,我有这些文件:

    $ ls -l /path/to/
    -rwx------  1 pjh grad_cs 5503600 Feb  3 00:07 chromedriver-2.9
    drwxr-xr-x  3 pjh grad_cs    4096 Mar 28 15:51 chromium
    

    当我使用与 OP 相同的 python 代码调用 chromedriver 时:

    driver = webdriver.Chrome('/path/to/chromedriver-2.9')
    

    这会导致异常消息。在 chromedriver.log 中,我发现了这条消息:

    [1.043][INFO]: Launching chrome: /path/to/chromium ...
    

    难以置信! chromedriver 正在尝试使用/path/to/chromium(不是可执行文件,而是包含源代码的目录)作为浏览器来执行!显然 chromedriver 在搜索我的PATH 之前尝试搜索当前目录以查找要运行的浏览器。因此,解决此问题的一个简单方法是检查chromedriver 所在的目录中的文件/目录,例如chromechromium,并将它们移动到与chromedriver 不同的目录。

    更好的解决方案是使用 chrome_options 参数明确告诉 selenium / chromedriver 执行哪个浏览器:

    options = webdriver.ChromeOptions()
    options.binary_location = '/opt/google/chrome/google-chrome'
    service_log_path = "{}/chromedriver.log".format(outputdir)
    service_args = ['--verbose']
    driver = webdriver.Chrome('/path/to/chromedriver',
            chrome_options=options,
            service_args=service_args,
            service_log_path=service_log_path)
    

    chromedriver.log 现在显示:

    [0.999][INFO]: Launching chrome: /opt/google/chrome/google-chrome ...
    

    正如预期的那样。

    【讨论】:

    • 谢谢伙计。不过我已经想办法了。碰巧只需从driver = webdriver.Chrome('/usr/local/bin/chromedriver') 更改为driver = webdriver.Chrome(),我就能让我的代码运行。我不知道为什么会这样,但就是这样! @pjhuw
    • 感谢您展示如何输出到 chromedriver.log。真的好用
    • 感谢您提供查找 chrome 驱动程序日志的方法。它帮助我找到了问题。
    • 另一个原因 - 我在没有 --no-sandbox 开关的情况下以 root 身份运行,并且 chrome 不喜欢它。切换到另一个用户,瞧。
    【解决方案3】:

    使用虚拟显示器的另一种解决方案是无头模式。

    from selenium import webdriver
    
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--window-size=1420,1080')
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    driver = webdriver.Chrome(chrome_options=chrome_options)
    

    【讨论】:

      【解决方案4】:

      如果使用 Linux,请确保您没有以 root 身份运行。那是什么给了我错误。

      【讨论】:

      • 如果您使用 CI 工具,您可能会以 root 身份运行而没有意识到(或无法控制它)。不幸的是,我不得不使用--no-sandbox 来让它工作。
      • Wowwwwww,它对我有用,但有人知道原因吗?
      【解决方案5】:

      有人已经提到了--no-sandbox 选项,但要对其进行扩展:确保它是您传递的第一个选项:

              System.setProperty("webdriver.chrome.driver",
                      Paths.get("setups", driverFolder, driverFile).toAbsolutePath().toString());
      
              ChromeOptions options = new ChromeOptions();
              Map<String, Object> prefs = new HashMap<>();
              prefs.put("intl.accept_languages", "English");
              options.setExperimentalOption("prefs", prefs);
      
              options.addArguments("--no-sandbox");
              options.addArguments("--disable-features=VizDisplayCompositor");
              options.addArguments("--incognito");
              options.addArguments("enable-automation");
              options.addArguments("--headless");
              options.addArguments("--window-size=1920,1080");
              options.addArguments("--disable-gpu");
              options.addArguments("--disable-extensions");
              options.addArguments("--dns-prefetch-disable");
              options.setPageLoadStrategy(PageLoadStrategy.NORMAL);
      
              options.addArguments("enable-features=NetworkServiceInProcess");
      
              DesiredCapabilities capabilities = DesiredCapabilities.chrome();
              capabilities.setCapability("marionette", true);
              capabilities.setCapability(ChromeOptions.CAPABILITY, options);
      
              WebDriver driver = new ChromeDriver(capabilities);
              driver.manage().timeouts().implicitlyWait(15, SECONDS);
              driver.manage().timeouts().pageLoadTimeout(15, SECONDS);
      

      在其他选项之后添加时,我得到了错误。

      【讨论】:

        【解决方案6】:

        您可以通过确保您的 chromedriver 版本与您安装的 Chrome 版本正确来解决此问题,您可以查看here。在安装新版本之前,您还需要删除当前版本的 chromedriver,如Delete Chromedriver from Ubuntu中所述

        【讨论】:

        • 我为此度过了美好的一天。最后是简单的版本不匹配!
        【解决方案7】:

        我遇到了同样的问题,并通过在以下位置安装 Chrome 来解决它:

        C:\Users\..\AppData\Local\Google\Chrome\Application
        

        您可以通过运行 Chrome 设置并在用户帐户控制提示时说“不”来做到这一点。

        【讨论】:

          【解决方案8】:

          我在Centos 7上使用scrapy + selenium + chrome驱动爬取东西时遇到了同样的错误,跟随url的方法解决了我的问题。

          yum install mesa-libOSMesa-devel gnu-free-sans-fonts
          

          参考:https://bugs.chromium.org/p/chromium/issues/detail?id=695212

          【讨论】:

            【解决方案9】:

            selenium webdriver 的另一种解决方案是 X 虚拟帧缓冲区:

            with Xvfb() as _:
                timeout_request = ConfigTargetsManager.target_global_configs.get('timeout_request', 10)
                driver = webdriver.Chrome(executable_path=ConfigTargetsManager.target_global_configs.get('chrome_browser_path',
                                                                                                         '/usr/lib/chromium-browser/chromedriver'))
                driver.get(url)
            

            【讨论】:

              【解决方案10】:

              使用以下步骤解决了此问题

              1. 安装 Xvfb Centos 7yum install chromedriver chromium xorg-x11-server-Xvfb

              2. 更新 chrome 驱动 Centos 7wget https://chromedriver.storage.googleapis.com/2.40/chromedriver_linux64.zip

              【讨论】:

              猜你喜欢
              • 2016-10-08
              • 2017-09-07
              • 1970-01-01
              • 2021-04-19
              • 2020-04-21
              • 1970-01-01
              • 2023-01-07
              • 2015-08-14
              • 1970-01-01
              相关资源
              最近更新 更多