未知错误:Chrome启动失败:异常退出
我在用Selenium和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)
我已经下载了稳定版的谷歌浏览器和chromedriver,并且用这段代码来启动浏览器。
driver = webdriver.Chrome('/usr/local/bin/chromedriver')
有没有人能给点建议?
11 个回答
有人提到过 --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);
如果把它放在其他选项后面,我就会遇到错误。
如果你在用Linux系统,记得不要以管理员身份(root)运行。这就是我遇到错误的原因。
使用虚拟显示的另一种解决方案是无头模式。
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)
为了帮助调试这个问题,你可以使用 service_log_path
和 service_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
所在的目录,看看是否有像 chrome
和 chromium
这样的文件或目录,并把它们移动到与 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 ...
这正是预期的结果。
对于Linux系统:
在启动Chrome浏览器之前,先启动显示器。想了解更多信息,可以点击这里
from pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 800))
display.start()
driver = webdriver.Chrome()