在过去一个月中,Google 和 Mozilla 已经在各自的浏览器中添加了 Headless
模式支持,这种机制允许浏览器在操作系统背景下静默运行,而不需要可视化的
GUI。

以往我们执行Selenium脚本,如果为了提高脚本的执行速度,我们可能会考虑使用HtmlUnit
或者更多的使用PhantomJS这类的Headless
浏览器,但这些工具要嘛对JavaScript支持不好,要嘛对web的支持不好,占用资源多,跟真实浏览器存在一定的差异等等问题。

Google Chrome最新版本发布了一个新的实用功能Headless Chrome。
无界面Chrome对浏览器自动化非常有用。
您可以使用命令行和编程语言捕获任何网页的屏幕截图,而无需启动Chrome GUI。
它还支持打印网页DOM并创建网页的pdf。

这个功能对开发人员来说非常有用,但也会带来一些广告软件的攻击。恶意软件或诈骗机制不需要夹带任何额外的工具,只要以
Headless 模式启动 Chrome 或 Firefox(无可见的
GUI)就能加载页面,侵入本地安装的软件后就能执行大部分恶意操作。

现在,Chrome 浏览器提供了Headless Chrome,简单说我们也可以在不打开chrome
GUI的情况在Chrome下执行我们的Selenium脚本。

本教程将帮助您在Linux命令行上使用Google Chrome Headless模式。

图片 1

如果想使用Headless Chrome
对Chrome版本有一定的要求,从官方文档我们可以看出,mac和linux环境要求chrome版本是59+,而windows版本的chrome要求是60+,同时chromedriver要求2.30+版本

1.启动无界面Chrome

BleepingComputer 公司的一份报告称,网络犯罪份子曾利用
PhantomJS(Headless 浏览器)发布论坛垃圾邮件。在 Chrome 和 Firefox
中添加 Headless 模式很有可能为恶意软件提供新的侵入渠道。

图片 2

打开系统控制台,并使用–headless命令行选项更多地启动Google Chrome
Headless模式。

(文/开源中国)    

Paste_Image.png

$ google-chrome –headless

假设你环境都已经具备了,那么我直接运行下面的Java Demo例子感受下:

这种无界面模式还支持远程调试选项,以检查发生的情况。
您可以在任何其他浏览器的指定端口上访问系统,并检查在那里渲染的内容。
在指定端口上使用以下命令启动调试:

    @Test
    public void OpenChromeTest() {
        String path = System.getProperty("user.dir");
        System.setProperty("webdriver.chrome.driver", path + "\drivers\chromedriver.exe");
        ChromeOptions chromeOptions = new ChromeOptions();
//        设置为 headless 模式 (必须)
        chromeOptions.addArguments("--headless");
//        设置浏览器窗口打开大小  (非必须)
        chromeOptions.addArguments("--window-size=1920,1080");
        WebDriver driver = new ChromeDriver(chromeOptions);
        driver.get("http://www.baidu.com");
        String title = driver.getTitle();
        System.out.println(title);
        driver.quit();
    }

$ google-chrome –headless 
–remote-debugging-port=9222

脚本运行我们确实没看到有任何的chrome浏览器启动,但是控制台也准确输出了:

现在在另一个Web浏览器中访问

图片 3

图片 4

Paste_Image.png

Headless
Chrome还具有许多其他有用的功能,如打印DOM,通过命令行捕获截图或创建任何网页的pdf。

如果你想了解更多关于headless
chrome,可以查看官网文档:https://developers.google.cn/web/updates/2017/04/headless-chrome

2.捕获网页截图

最后最后,从Firefox官方上看到,火狐也将推出headless模式,预计在linux环境的55版本推出,并Firefox
56版本在全平台推出。值得期待!

您可以使用–screenshot选项来捕获任何网页的截图。
输出屏幕截图将保存在当前目录中。

16/8/2017 补充
  这几天老有人问起,如果对于通过Grid
服务启动的chrome,该如何去设置chrome。 这里就简单给几行代码演示下:

$ goolge-chrome –headless –disable-gpu –screenshot

ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
DesiredCapabilities dc = DesiredCapabilities.chrome();
dc.setCapability(ChromeOptions.CAPABILITY, chromeOptions);
WerbDriver driver = new RemoteWebDriver(new URL(hubURL), dc);

3.创建网页PDF

19/9/2017 补充
偶然已经发现火狐开发者网站上已经有headless Firefox
的Demo例子了,但是从文章看window/mac
版本需要火狐版本56+,linux版本55+。
https://developer.mozilla.org/en-US/Firefox/Headless_mode
以下我直接拷贝站点上的java例子以供大家参考:

您可以使用–print-to-pdf选项来创建任何网页的PDF。
输出pdf文件将保存在当前目录中。

package com.mozilla.example;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxBinary;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;

import java.util.concurrent.TimeUnit;

public class HeadlessFirefoxSeleniumExample {
 public static void main(String [] args) {
   FirefoxBinary firefoxBinary = new FirefoxBinary();
   firefoxBinary.addCommandLineOptions("--headless");
   System.setProperty("webdriver.gecko.driver", "/opt/geckodriver");
   FirefoxOptions firefoxOptions = new FirefoxOptions();
   firefoxOptions.setBinary(firefoxBinary);
   FirefoxDriver driver = new FirefoxDriver(firefoxOptions);
   try {
     driver.get("http://www.google.com");
     driver.manage().timeouts().implicitlyWait(4,
         TimeUnit.SECONDS);
     WebElement queryBox = driver.findElement(By.name("q"));
     queryBox.sendKeys("headless firefox");
     WebElement searchBtn = driver.findElement(By.name("btnK"));
     searchBtn.click();
     WebElement iresDiv = driver.findElement(By.id("ires"));
     iresDiv.findElements(By.tagName("a")).get(0).click();
     System.out.println(driver.getPageSource());
   } finally {
     driver.quit();
   }
 }
}

4.打印网页DOM

您可以使用–dump-dom标志将document.body.innerHTML打印到标准输出。
  -dump-dom标志将document.body.innerHTML打印到stdout:

$ google-chrome –headless –disable-gpu –dump-dom

参考:访问以下链接以了解有关Headless Chrome的更多详细信息。

Google Chrome隐藏设置URL列表汇总 
http://www.linuxidc.com/Linux/2016-10/135674.htm

Ubuntu
16.04下安装64位谷歌Chrome浏览器 
http://www.linuxidc.com/Linux/2016-05/131096.htm

Ubuntu 16.04中为Chromium、Chrome、Firefox安装Flash播放器插件 
http://www.linuxidc.com/Linux/2016-05/131098.htm

Ubuntu 16.04环境Chrome中文字体更换
http://www.linuxidc.com/Linux/2016-05/131093.htm

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-07/145558.htm

图片 5