有没有办法以无头模式启动Google Chrome?

62
我仔细查看了http://peter.sh/experiments/chromium-command-line-switches/#chrome-frame上的开关列表,但没有找到可以启动Chrome隐藏后台进程的选项。
最接近的是使用--keep-alive-for-test选项+自定义封装应用程序,但该应用程序无法执行任何传递的代码,因为(它的报告方式是)“没有窗口 - ChromeHidden”。

啊,谢谢大家,但是我用的是Windows系统... - Silviu-Marian
1
你正在尝试解决什么问题? - Mike West
扩展Titanium桌面应用程序的功能;我测试了所有其他替代方案(NodeJS - ZombieJS,PhantomJS,JSDOM),它们与之相比极其缓慢。 - Silviu-Marian
根据您的需求,DumpRenderTree可能是合适的选择。您是想实时运行JavaScript,还是只是渲染HTML呢? :) - Mike West
据我所知,Windows无法在无头模式下运行。 - Vanuan
显示剩余2条评论
11个回答

66

简而言之

google-chrome --headless --remote-debugging-port=9222 http://example.com

为了使用无头模式,您还需要临时添加--disable-gpu参数。


教程:

https://developers.google.com/web/updates/2017/04/headless-chrome


还有一个正在进行中的工作:https://code.google.com/p/chromium/issues/detail?id=546953

主要成果包括:

  1. 一个无头应用程序可以链接到的库。
  2. 演示无头API使用的示例应用程序。

因此,可以创建一个简单的控制台应用程序而不连接到显示器。

更新Apr 18 '16: 工作基本完成。现在有一个公开论坛:

https://groups.google.com/a/chromium.org/forum/#!forum/headless-dev

正在编写文档:

https://chromium.googlesource.com/chromium/src/+/master/headless/README.md

更新Sep 20 '16: 看起来Chrome最终会获得"--headless"参数:https://bugs.chromium.org/p/chromium/issues/detail?id=612904

在BlinkOn 6(2016年6月16/17日)上有一个演示。

更新Nov 29 '16: "--headless"标志的设计文档:https://docs.google.com/document/d/1aIJUzQr3eougZQp90bp4mqGr5gY6hdUice8UPa-Ys90/edit#heading=h.qxqfzv2lj12s

更新Dec 13 '16: "--headless"标志预计很快将在Canary版本中提供

更新Mar 12 '17: Chrome 57已经可以使用"--headless"标志。等待Selenium和其他工具跟进。用户指南:https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md


2
还没有在 Windows 上实现。难道不应该把 Windows 视为首要任务吗?毕竟大多数人(甚至开发人员)都在使用 Windows。 - Pacerier
3
据我所知,大多数网站开发人员使用基于Unix的系统。CI服务器主要运行在Linux上。确实,大多数用户使用Windows。但这也是为什么人们喜欢Web的原因:它是跨平台的,因此浏览器在所有平台上都能以相同的方式工作。 - Vanuan
1
截至今天,Chrome 59 包括 --headless 选项(Mac 和 Linux)。顺便问一下,你知道如何列出所有 chrome 命令行选项吗? - Déjà vu
之前我错过了 --remote-debugging-port 选项,发现 Chromium 进程没有启动,加上这个选项后就可以了。 - Jinlxz Liu

24

这位开发者使用Xvfb(X虚拟帧缓冲器)来欺骗Chrome以为它正在显示一个窗口,成功地在无界面的情况下运行了Chrome:

http://e-method.blogspot.fr/2010/11/google-chrome-with-xvfb-headless-server.html

如果你在Linux上,你可以尝试这个方法。

基本上,你需要安装X虚拟帧缓冲器和Google Chrome:

root@localhost: ~# apt-get install xvfb imagemagick
root@localhost: ~# apt-get install google-chrome

然后在显示器上运行浏览器:

root@localhost: ~# xvfb-run --server-args='-screen 0, 1024x768x24' \
google-chrome -start-maximized http://www.example.com \
> & /dev/null &
root@localhost: ~# DISPLAY=:99 import -window root myimage.png

3
那个链接已经失效了,但是通过谷歌搜索我找到了这个链接:http://e-method.blogspot.fr/2010/11/google-chrome-with-xvfb-headless-server.html。 - Ritesh
我使用Vagrant/Ansible在Ubuntu虚拟机上配置了无头Chrome:https://github.com/alexwoolford/vagrantHeadlessChrome。我在Mac上操作,但相信这也适用于Windows系统。 - Alex Woolford
Chris B 我在 Ubuntu 上尝试了这个方法 请参见此处,但似乎对我无效。还有其他建议吗? - zabumba
@GRIGORE-TURBODISEL,现在你可以在Windows上运行Ubuntu了 :)。 - Vanuan
@Iordanis,@Chris,但是与真正的无头Chrome不同,我认为您不能调用那些远程控制API和函数,对吗?那么你要如何“驱动”浏览器呢? - Pacerier
嗨,如果尝试运行 Cucumber 测试,这将如何工作? - Richlewis

12

您可以看一下PhantomJS项目,它是一个无界面的WebKit实现。


3
我知道这是事实,因为我已经测试过它。你可以针对几乎任何支持JS的解决方案进行测试,比如Sencha的ExtJS4复杂演示或Google的Adwords关键字工具界面。 - Silviu-Marian
4
近期,WebKit已被Blink所取代,因此PhantomJS不再模拟现代版的Chrome。 - matanster
PhantomJS 也不支持 IndexedDb。 - ocodo
2
我的机器上Phantom慢了10倍,从此开始使用Selenium/chromedriver。 - arkod
1
PhantomJS将让位于Chrome Headless:https://www.infoq.com/news/2017/04/Phantomjs-future-uncertain - eflat
显示剩余5条评论

7

原来,如果您将其作为子进程启动,则它会以无头模式启动。除此之外:

  • nircmd.exe 可以根据 Chrome 的 PID 执行 win hide 操作
  • Autohotkey_L 也可以在不显示任务栏按钮的情况下启动 Chrome

3
我知道这是一个旧回答,但请问是否有任何代码示例可以展示一下?非常感谢。 - Meligy
但是您仍然需要运行X服务器来启动父进程,对吗?或者您的意思是说父进程不一定是Chrome? - Vanuan
呵呵,我重新读了一下问题。Windows 无法在无头模式下运行 :) - Vanuan

7
你可以设置一个Linux虚拟机,然后在其中使用xvfb。
Debian / Ubuntu的安装方法:
sudo aptitude install xvfb

启动 Chrome 无头模式并访问 http://example.com :

xvfb-run --server-args='-screen 0, 1024x768x16' google-chrome 
    -start-maximized http://example.com > /dev/null &

我已经准备好了所有设置 - 但是如何在使用chromedriver的java类中实现这一点? - DanGordon

5

看起来Chromium嵌入式框架项目可能适合您的用例。尽管我没有亲身经验,但我听到了不少好评,而且它有一个坚实的API,您应该能够用于自己的目的。


还有Chromium Content Shell:https://github.com/adobe/brackets/wiki/CEF3-vs.-Chromium-Content-Shell - Vanuan

3

我还没有足够的声望来发表评论,但是想让你们知道Vanuan提到的Chrome无头模式实际上可以与Selenium webdriver一起使用。

在Java中,您可以通过以下代码将标志传递给ChromeDriver:

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

2
我最近发现了这篇文章,其中提到了几个命令行选项似乎可以实现这个功能。使用这些关键词,我在谷歌上找到了这段代码,看起来证实了这些选项的存在。
// Does not automatically open a browser window on startup (used when
// launching Chrome for the purpose of hosting background apps).
const char kNoStartupWindow[]               = "no-startup-window";

// Causes Chrome to launch without opening any windows by default. Useful if
// one wishes to use Chrome as an ash server.
const char kSilentLaunch[]                  = "silent-launch";

我成功地使用 --no-startup-window 命令运行了 Chrome,并且它确实在没有任何窗口的情况下启动了。它看起来是正常启动的,生成了所有典型的子进程,但我尝试加载的网站似乎并没有被访问。可能这个无头模式只适用于运行应用程序而不适用于无头*)访问站点,但正常的工作树已经设置好了,只是没有窗口。
第二个选项 --silent-launch 让 Chrome 进程非常安静。我没有注意到任何生成的子进程,该进程迅速退出。我怀疑它在这种情况下并不可用。
在我的尝试失败后,我将注意力转向了不太复杂的方法。在列表底部有两个选项:
// Specify the initial window position: --window-position=x,y
const char kWindowPosition[]                = "window-position";

// Specify the initial window size: --window-size=w,h
const char kWindowSize[]                    = "window-size";

我使用选项启动Chrome,将其完全移出工作区。
--window-size=800,600 --window-position=-800,0

“虽然感觉很不好,但这并不是真正的无头浏览器,但窗口确实已经消失在我的视野中,而且所有操作都是通过Chrome的启动选项完成的,没有使用外部工具发送低级窗口隐藏消息。”
“*) 是的,我知道自己在尝试奇怪的事情。本质上,我试图摆脱Karma测试期间保留的Chrome窗口。我知道我可以切换到PhantomJS,但我特别需要在Chrome中运行它们,并且弹出的窗口在长期运行中会令人困扰。”

0

该项目目前正在开发中,您可以从这里阅读更多信息: https://chromium.googlesource.com/chromium/src/+/master/headless/README.md

Headless Chromium是一个在无头/服务器环境下运行Chromium的库。预期使用情况包括加载网页、提取元数据(例如DOM)以及从页面内容生成位图——使用Chromium和Blink提供的所有现代Web平台功能。

它目前适用于Linux系统,并有一个漂亮的演示


0

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