未知错误:Chrome启动失败:异常退出

58

当我使用chromedriver运行我的测试时,我遇到了这个错误。

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和Chromedriver,并使用以下代码启动了浏览器。
driver = webdriver.Chrome('/usr/local/bin/chromedriver')

有什么建议吗?

11个回答

44

对于Linux:

在启动Chrome之前,请先启动显示器。有关更多信息,请单击此处

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

10
你好,pyvirtualdisplay是用于Python中模拟虚拟显示器的库。它允许你在没有图形界面的情况下运行带有GUI的应用程序,例如Selenium Webdriver测试和屏幕录制。通常,在服务器上运行这些应用程序时,不能使用真实的物理显示器,因此需要使用虚拟显示器来模拟一个环境。 - Anirudh
5
需要运行以下命令:>> "pip install pyvirtualdisplay" 和 >> "sudo apt-get install xvfb" - vikramvi
可见标志是做什么用的?我无论是否指定,都看不到任何显示。 - Ryan w
一个很好的解决方案!我使用选项--headless运行我的驱动程序,但突然间这个选项不再可用,导致错误和困扰。这个解决方案完美地解决了这个问题。@vikramvi提到安装xvfb也非常有帮助。谢谢! - Konemiees

34
为了帮助调试这个问题,您可以使用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)

我曾遇到相同的异常信息,并发现两种方法可以解决它;我不确定楼主的问题是否相同,但如果不是的话,看一下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

当我使用与原帖作者相同的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 ...

如预期。


4
谢谢,但我已经想出了一种方法。只需要将driver = webdriver.Chrome('/usr/local/bin/chromedriver') 更改为 driver = webdriver.Chrome() ,我就可以运行我的代码了。我不知道为什么会这样,但它确实可以!@pjhuw - Saheb
1
感谢您展示如何输出到chromedriver.log,非常有用。 - frequent
感谢提供查找 Chrome 驱动程序日志的方法。这帮助我找到了问题。 - Simbu
2
另一个原因是我在没有--no-sandbox开关的情况下使用root运行,但Chrome不喜欢它。切换到另一个用户,问题迎刃而解。 - Gunjit
哇,这对我有用。你是我的救星。 - Aakash Dusane

28
使用虚拟显示器的另一种解决方案是无头模式。
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)

谢谢。经过数小时的搜索,这是唯一有效的解决方案。你让我的一天变得美好了。 - sogu
四年后...谢谢! - AudioBaton

13

如果使用Linux,请确保您不是以root用户身份运行。这就是导致我出错的原因。


3
如果您正在使用CI工具,则可能在不知情或无法控制的情况下以root权限运行。我不得不不幸地使用--no-sandbox来使其正常工作。 - user2561747
2
哇塞,它对我起作用了,但是有人知道原因吗? - Umair Ayub
GuySoft,你好,我尝试了StackOverflow上所有的方法,但是错误问题没有解决。我如何在没有root权限的情况下切换到其他用户运行? - Tornike Kharitonishvili
@TornikeKharitonishvili 你的Python脚本应该以另一个用户身份运行,例如你可以确定用户ID为1000的用户,在单用户系统中往往是默认用户。命令如下:sudo -u $(awk -F':' -v uid=1000 '$3 == uid { print $1 }' /etc/passwd) python3 ./script.py - GuySoft

7

已经有人提到--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);

当我在其他选项后添加它时,我遇到了错误。


2

您可能可以通过确保您安装的Chrome版本与chromedriver版本相匹配来解决此问题,您可以在这里检查。在安装新版本之前,您还需要删除当前版本的chromedriver,如从Ubuntu中删除Chromedriver所述。


我在这上面花了一整天时间。最后发现只是版本不匹配的问题! - beeCwright

1

以下步骤可解决此问题:

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

  2. 更新 Chrome Driver Centos 7wget https://chromedriver.storage.googleapis.com/2.40/chromedriver_linux64.zip


请查看以下网址了解如何在CentOS上安装Xvfb:https://reiners.io/installing-xvfb-in-centos/ - praveen kedar

0

0

Ubuntu 22.04。 可能对某些人有用。 当我尝试使用从brave.com存储库安装的版本的Brave(Deb)与selenium配合工作时,我遇到了这个错误。

此外,我还从snap镜像中安装了Brave,并将其添加:

options.add_argument('--remote-debugging-port=9224')
options.binary_location = '/snap/bin/brave'

问题已经解决。


0

我曾面临相同问题,并通过安装Chrome来解决:

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

您可以通过运行 Chrome 安装程序,在用户账户控制提示时选择“否”来完成此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接