SeleniumでヘッドレスFirefoxを利用する

Firefoxには、GUIを持たないヘッドレスモードがあります。
画面を描画しないので

  • 通常のFirefoxより高速で、リソースの消費も少ない
  • Linuxなど、GUIを持たない環境でも利用できる
  • バックグラウンドで処理されるのでPCを占有しない。
    Seleniumが動作している間も、ユーザーは別作業ができる。

といった特長があります。

ヘッドレスモードでFirefoxDriverを起動する

FirefoxDriverのFirefoxOptionsクラスを利用します。
add_argumentメソッドを使用して、起動時のオプションに【headless】を追加します。

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

options = Options()
options.add_argument('--headless')
path = r'D:\tmp\driver\geckodriver-v0.25.0-win64\geckodriver.exe'

driver = webdriver.Firefox(executable_path=path, options=options)
driver.get('https://google.com')
driver.get_screenshot_as_file(r"D:\tmp\sc1.png")    #上書きOK
driver.quit()
package example;
import java.io.*;
import org.apache.commons.io.*;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.OutputType;
public class headless_fx {
    public static void main( String[] args )
    {
        String path = "D:/tmp/driver/geckodriver-v0.25.0-win64/geckodriver.exe";
        FirefoxOptions options = new FirefoxOptions();
        options.addArguments("--headless");
        System.setProperty("webdriver.gecko.driver", path);
        WebDriver driver = new FirefoxDriver(options);
        driver.get("https://google.com");
        File tmp = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        try{
            System.out.println(tmp);
            File sc1 = new File("D:\\tmp\\sc1.png");
            FileUtils.forceDelete(sc1);
            FileUtils.moveFile(tmp, sc1); //上書きNG
        }catch(Exception e){
            e.printStackTrace();
        }
        driver.quit();
    }
}
using System;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;

namespace example
{
    class Program
    {
        static void Main(string[] args)
        {
            FirefoxOptions options = new FirefoxOptions();
            options.AddArgument("--headless");
            String path = @"D:\tmp\driver\geckodriver-v0.25.0-win64";

            IWebDriver driver = new FirefoxDriver(path, options);
            driver.Navigate().GoToUrl("https://google.com");
            Screenshot ss = ((ITakesScreenshot)driver).GetScreenshot();
            ss.SaveAsFile(@"D:\tmp\sc1.png", ScreenshotImageFormat.Png);    //上書きOK
            driver.Quit();
        }
    }
}
Imports OpenQA.Selenium
Imports OpenQA.Selenium.Firefox
Module Module1
    Sub Main()
        Dim options = New FirefoxOptions()
        options.AddArgument("--headless")

        Dim path = "D:/tmp/driver/geckodriver-v0.25.0-win64"
        Dim driver = New FirefoxDriver(path, options)

        driver.Navigate().GoToUrl("https://google.com")
        Dim ss = driver.GetScreenshot()
        ss.SaveAsFile("D:\tmp\sc1.png", ScreenshotImageFormat.Png)    '上書きOK
        driver.Quit()
        
    End Sub
End Module
require "selenium-webdriver"

options = Selenium::WebDriver::Firefox::Options.new
options.add_argument('--headless')
path = 'D:\tmp\driver\geckodriver-v0.25.0-win64\geckodriver.exe'

driver = Selenium::WebDriver.for :firefox, driver_path:path, options:options
driver.get("https://google.com")
driver.save_screenshot("D:\\tmp\\sc1.png")    #上書きOK
driver.quit()
let webdriver = require('selenium-webdriver');
let firefox = require('selenium-webdriver/firefox');
const fs = require('fs');

var options = new firefox.Options;
options.addArguments("--headless");
let path = "D:/tmp/driver/geckodriver-v0.25.0-win64/geckodriver.exe";

(async () => {
    var driver = await new webdriver.Builder()
        .forBrowser('firefox')
        .setFirefoxOptions(options)
        .setFirefoxService(new firefox.ServiceBuilder(path))
        .build();            
    await driver.get("https://google.com");
    var ss = await driver.takeScreenshot();
    fs.writeFile('D:\\tmp\\sc1.png', ss, 'base64', function(err) {
        //console.log(err);
    });
    /* 1行で書く場合
    await driver.takeScreenshot().then(function(image){
        fs.writeFile('D:\\tmp\\sc1.png', image, 'base64', function(err) {
            console.log(err);
        });
    });*/
    await driver.quit();
})();

プログラムを実行すると、画面上には何も現れませんが、Firefoxが起動します。

タスクスマネージャー

ブラウザの画面イメージも取得可能です。

取得イメージ
sc1.png